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

4ff67a63c23b9df0e2f9ec8a850b1822.jpgВ проекте используется 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.

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

$scope.isAvailable = function (is_available){ return! is_available; } Но можно еще и так:

Это распространяется еще и на ng-hide и ng-show.

© Habrahabr.ru