Pull to refresh

AngularJS: нестандартное поведение ng-if

Reading time 1 min
Views 23K

В проекте используется angularjs, проект уже достаточно большой, используем очень много кастомных директив, но сегодня столкнулся с проблемой поведения ng-if .

Для меня было ожидаемо, что условие работает так же как и в js, то есть:

if (condition) {
 ...
} else {
 ....
}


В зависимости, что передано — элемент будет скрыт или показан.



В моем случае проверялось наличие поля в объекте ng-if="column.is_available". Тип поля — строка, но может быть нескольких вариантов:
  • Yes
  • No
  • After %N% days
  • и так далее


Все было хорошо, до тех пор, пока не проверил состояние No. Оказывается, angularjs использует функцию toBoolean, при проверки условия, которая имеет достаточно не обычное (по крайней мере для меня) поведение:

function toBoolean(value) {
  if (typeof value === 'function') {
    value = true;
  } else if (value && value.length !== 0) {
    var v = lowercase("" + value);
    value = !(v == 'f' || v == '0' || v == 'false' || v == 'no' || v == 'n' || v == '[]');
  } else {
    value = false;
  }
  return value;
}


То есть вернёт false при строках:
  • f
  • 0
  • no
  • n
  • []


В официальной документации об этом ничего не сказано. Может в каких либо случаях это круто и удобно, но в моем нет. Как минимум для таких проверок нужно использовать дополнительную директиву, ng-extra-if="condition", а для обычной ng-if — обычный if, такой же как в js.

Решил проблему так:

<div ng-if="isAvailable(row.is_available)">


$scope.isAvailable = function(is_available){
    return !!is_available;
} 


Но можно еще и так:

<div ng-if="!!row.is_available">


Это распространяется еще и на ng-hide и ng-show.
Only registered users can participate in poll. Log in, please.
Как вы считаете, это нормальное поведение?
30.37% да 133
44.98% нет 197
24.66% такое нужно выносить в отдельную директиву 108
438 users voted. 145 users abstained.
Tags:
Hubs:
+14
Comments 13
Comments Comments 13

Articles