Я понимаю это ng-show
и ng-hide
влияю на набор классов для элемента, и это ng-if
контролирует, отображается ли элемент как часть DOM.
Существуют ли рекомендации по выбору ng-if
более ng-show
/ ng-hide
или наоборот?
Я понимаю это ng-show
и ng-hide
влияю на набор классов для элемента, и это ng-if
контролирует, отображается ли элемент как часть DOM.
Существуют ли рекомендации по выбору ng-if
более ng-show
/ ng-hide
или наоборот?
Ответы:
Зависит от вашего варианта использования, но суммируя разницу:
ng-if
удалит элементы из DOM. Это означает, что все ваши обработчики или что-либо еще, прикрепленное к этим элементам, будут потеряны. Например, если вы привязали обработчик щелчка к одному из дочерних элементов, когда ng-if
значение равно false, этот элемент будет удален из DOM, и ваш обработчик щелчков больше не будет работать, даже после того, как ng-if
позднее значение станет равным true и отобразит элемент. Вам нужно будет снова прикрепить обработчик.ng-show/ng-hide
не удаляет элементы из DOM. Он использует стили CSS для скрытия / отображения элементов (примечание: вам может понадобиться добавить свои собственные классы). Таким образом, ваши обработчики, которые были привязаны к детям, не будут потеряны.ng-if
создает дочернюю область, пока ng-show/ng-hide
неЭлементы, которых нет в DOM, оказывают меньшее влияние на производительность, и ваше веб-приложение может работать быстрее по ng-if
сравнению с ng-show/ng-hide
. По моему опыту, разница незначительна. Анимации возможны при использовании обоих ng-show/ng-hide
и ng-if
с примерами для обоих в документации Angular.
В конечном итоге, вам нужно ответить на вопрос: можете ли вы удалить элемент из DOM или нет?
ng-if
. Проверьте параграф Анимации и пример в документах . Также с ng-hide/ng-show
селекторами CSS, как :first-child
или :nth-child
не будет работать должным образом, так как скрытые элементы также будут учитываться.
ng-if
создает новую область, пока ng-show
нет.
Смотрите здесь для CodePen, который демонстрирует разницу в том, как работает ng-if / ng-show, с точки зрения DOM.
@markovuksanovic хорошо ответил на вопрос. Но я бы пришел к этому с другой точки зрения: я всегда использовал ng-if
и извлекал эти элементы из DOM, если только:
$watch
-es на ваших элементах, чтобы они оставались активными, пока они невидимы. Формы могут быть хорошим примером для этого, если вы хотите иметь возможность проверять достоверность входных данных, которые в данный момент не видны, чтобы определить, является ли вся форма действительной.Angular написан действительно хорошо. Это быстро, учитывая, что он делает. Но то, что он делает, - это целая куча магии, которая делает сложные вещи (такие как двухстороннее связывание данных) тривиально простыми. Чтобы все это выглядело легко, нужно немного снизить производительность. Вы можете быть потрясены, когда поймете, сколько сотен или тысяч раз оценивается функция сеттера в течение $digest
цикла на куске DOM, на который никто даже не смотрит. И тогда вы понимаете, что десятки или сотни невидимых элементов делают одно и то же ...
Рабочие столы действительно могут быть достаточно мощными, чтобы сделать большинство проблем со скоростью выполнения JS спорными. Но если вы разрабатываете для мобильных устройств, использование ng-if, если это возможно, должно быть легким делом. Скорость JS по-прежнему важна для мобильных процессоров. Использование ng-if - это очень простой способ получить потенциально значимую оптимизацию при очень и очень низких затратах.
ng-show
может быть полезным, когда у вас есть, скажем, вкладки, каждая из которых содержит много контента, который занимает время для визуализации. После первого рендеринга перемещение между вкладками будет мгновенным, тогда какng-if
потребуется повторный рендеринг, привязка событий и т. Д. Как вы можете сказать, недостатком является создание часов, выполняющихся в фоновом режиме. Angular отчаянно нуждаетсяng-ifshowwatch
Из моего опыта:
1) Если на вашей странице есть переключатель, использующий ng-if / ng-show для отображения / скрытия чего-либо, ng-if вызывает большую задержку браузера (медленнее). Например: если у вас есть кнопка для переключения между двумя представлениями, ng-show будет работать быстрее.
2) ng-if создаст / уничтожит область видимости, когда оценивается как true / false. Если к ng-if подключен контроллер, этот код контроллера будет выполняться каждый раз, когда ng-if оценивается как true. Если вы используете ng-show, код контроллера выполняется только один раз. Поэтому, если у вас есть кнопка, которая переключается между несколькими представлениями, использование ng-if и ng-show очень сильно изменит способ написания кода контроллера.
Ответ не прост:
Это зависит от целевых машин (мобильный или настольный компьютер), от природы ваших данных, браузера, операционной системы, аппаратного обеспечения, на котором он работает ... вам нужно будет тестировать, если вы действительно хотите знать.
В основном это проблема памяти против вычислений ... так как с большинством проблем производительности разница может стать значительной с повторяющимися элементами (n), такими как списки, особенно когда они вложенные (nxn или хуже), а также какие вычисления вы выполняете внутри этих элементов :
ng-show : если эти необязательные элементы часто присутствуют (плотно), как, например, в 90% случаев, может быть быстрее подготовить их и только показать / скрыть их, особенно если их содержимое дешевое (просто текст, ничего вычислить или загрузить). Это потребляет память, поскольку заполняет DOM скрытыми элементами, но просто показать / скрыть то, что уже существует, вероятно, будет дешевой операцией для браузера.
ng-if : если элементы, скорее всего, не будут отображаться (разреженно), просто создайте их и уничтожьте их в режиме реального времени, особенно если их содержимое требует больших затрат (вычисления / сортировка / фильтрация, изображения, созданные изображения). Это идеально для редких элементов или элементов «по требованию», оно экономит память с точки зрения незаполнения DOM, но может стоить больших вычислений (создание / уничтожение элементов) и пропускной способности (получение удаленного контента). Это также зависит от того, сколько вы вычисляете в представлении (фильтрация / сортировка) по сравнению с тем, что у вас уже есть в модели (предварительно отсортированные / предварительно отфильтрованные данные).
Одно важное замечание:
ngIf (в отличие от ngShow) обычно создает дочерние области, которые могут давать неожиданные результаты.
У меня была проблема, связанная с этим, и я потратил НАМНОГО времени, чтобы выяснить, что происходит.
(Моя директива записывала значения модели в неверную область.)
Поэтому, чтобы сохранить свои волосы, просто используйте ngShow, если вы не слишком медленно бегаете.
Разница в производительности едва заметна в любом случае, и я пока не уверен, кому это выгодно, без теста ...
$parent.scopevar
привязок данных в ngIf исправит проблемы, связанные с дочерними областями, при использовании ngIf
ngIf
повсюду полагали, что это улучшит производительность. Это просто не соответствует действительности, и нельзя сказать, что лучше, ngIf
или ngShow
без теста или глубокого анализа в конкретном случае. Итак, я все еще рекомендую забыть о том ngIf
, что пока кто-то не видит плохую производительность или не знает, что он делает
ng-if на ng-include и на ng-controller будет иметь большое влияние на ng-include, он не будет загружать требуемую часть и не обрабатывать, если для ng-controller не установлено значение true, он не будет загружать контроллер, если флаг не установлен истина, но проблема в том, что когда флаг становится ложным в ng, если он удаляется из DOM, когда флаг возвращается в истинное значение, он перезагружает DOM, в этом случае ng-show лучше, на один раз лучше показывает ng-if
Если вы используете ng-show or ng-hide
контент (например, миниатюры с сервера), будут загружаться независимо от значения выражения, но будут отображаться на основе значения выражения.
При использовании ng-if
контент будет загружен только в том случае, если выражение ng-if оценивается как истинное.
Использование ng-if - хорошая идея в ситуации, когда вы собираетесь загружать данные или изображения с сервера и показывать их только в зависимости от взаимодействия с пользователем. Таким образом, загрузка страницы не будет заблокирована ненужными и интенсивными задачами.
src
атрибут img
тега, когда он присутствует, он загружается!