- PVSM.RU - https://www.pvsm.ru -
В проекте используется angularjs, проект уже достаточно большой, используем очень много кастомных директив, но сегодня столкнулся с проблемой поведения ng-if
.
Для меня было ожидаемо, что условие работает так же как и в js, то есть:
if (condition) {
...
} else {
....
}
В зависимости, что передано — элемент будет скрыт или показан.
В моем случае проверялось наличие поля в объекте ng-if="column.is_available"
. Тип поля — строка, но может быть нескольких вариантов:
Все было хорошо, до тех пор, пока не проверил состояние No. Оказывается, angularjs использует функцию toBoolean, при проверки условия, которая имеет достаточно не обычное (по крайней мере для меня) поведение [1]:
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
при строках:
В официальной документации об этом ничего не сказано. Может в каких либо случаях это круто и удобно, но в моем нет. Как минимум для таких проверок нужно использовать дополнительную директиву, 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
.
Автор: tuchk4
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/angularjs/61527
Ссылки в тексте:
[1] поведение: https://github.com/angular/angular.js/blob/d3c50c845671f0f8bcc3f7842df9e2fb1d1b1c40/src/Angular.js#L1036
[2] Источник: http://habrahabr.ru/post/225243/
Нажмите здесь для печати.