Pull to refresh

Comments 13

Для меня еще было неожиданностью, что пусть массив тоже будет интерпретирован как false значение.
так ведь не просто массив, а пустой массив, это вполне удобно когда нужно вывести сообщение на пустом массиве, который позже наполнится через ресурс
Возможно, но в моем случае я использовал одно и тоже свойство и для отоброжения данных и для показа лоадера, в случае когда свойство еще undefined. Таким образом получал бесконечный лоадер, когда вместо undefined был пустой массив.
Это известная особенность JavaScript:
Image #2215217, 6.8 KB
Хотя, в toBoolean условие похитрее, которое намеренно пустой массив считает ложным значением.
да, все верно — в js у массива и строки по сути идет
toBoolean = function(){
return this.length.toBoolean();
}
Это, в принципе, задокументировано, но во внезапном месте (api/ng/directive/ngHide), и нет четкого указания, что это относится ко всем внутренним директивам.

По-хорошему, конечно, это должно быть написано где-то в guide/expression.

Зачем так сделано? Думаю, для более удобного комбинирования с input… ng-value/ng-false-value. Две директивы, думаю, не надо — "!!" написать не проблема. Но надо, конечно, об этой особенности помнить.
Этот момент описан в официальной документации к директиве ng-show

Note: Here is a list of values that ngShow will consider as a falsy value (case insensitive):
«f» / «0» / «false» / «no» / «n» / "[]"


Наверно, просто косяк документации. Я думаю, что если это нормально описано в документации и ты об этом помнишь, то это удобно, почему бы и нет? Но если об этом не знать, то безусловно, это головная боль. На один раз. Пока не разберешься. Потом знаешь и пользуешься.
Хочу обратить внимание, что он не просто скрывает элемент, он изымает целиком узел из DOM или вставляет на это место его копию, в то время как show|hide только меняют свойство CSS visibility. В момент удаления скоуп элемента уничтожается, и создаётся новый в момент восстановления. Иногда это критично. Часта ошибка когда пытаешься показать динамический элемент, загруженный позже, а ничего не происходит — не учтено поведение ngIf

https://code.angularjs.org/1.2.16/docs/api/ng/directive/ngIf
show|hide только меняют свойство CSS visibility

Меняется свойство display на "none !important;"
UFO just landed and posted this here
Значения 0 и [] в качестве false вполне допускаю. Остальные значения выглядят несколько надуманно. Судя по опыту топикстартера, эти неожиданные значения не соответствуют false в предметной области проекта.
Интересно, что вы будете делать, когда ВНЕЗАПНО! потребуется локализовать «Yes|No|After %N% days|...»? Будете жаловаться, что ng-if неправильно понимает «Да|Нет» или будете старательно выискивать и переписывать все места, где использовалась такая конструкция?
Sign up to leave a comment.

Articles