AngularJS: ngInclude против директивы

Я не совсем понимаю, когда использовать директиву, и когда было бы целесообразнее использовать nginclude. Возьмите этот пример: у меня есть частичное, password-and-confirm-input-fields.html, это HTML для ввода и подтверждения пароля. Я использую это как на странице регистрации, так и на странице смены пароля. Каждая из этих двух страниц имеет контроллер, в частичном html нет выделенного контроллера.

Должен ли я использовать директиву или ngInclude за это?

1 ответ

Решение

Все зависит от того, что вы хотите от вашего фрагмента кода. Лично, если код не имеет никакой логики, или даже не нуждается в контроллере, тогда я иду с ngInclude, Я обычно помещаю большие более "статичные" фрагменты HTML, которые я не хочу, чтобы загромождать представление здесь. (т.е.: скажем, большая таблица, данные которой поступают от родительского контроллера в любом случае. <div ng-include="bigtable.html" /> чем все эти строки загромождают вид)

Если есть логика, манипулирование DOM или вам нужно, чтобы она была настраиваемой (иначе визуализируется) в разных экземплярах, которые она использует, то directives лучший выбор (сначала они пугающие, но они очень мощные, дайте время).

ngInclude

Иногда вы увидите ngInclude's на которые влияет их внешность $scope / interface, Например, большой / сложный повторитель. Эти 2 интерфейса связаны между собой из-за этого. Если что-то в основном $scope изменения, вы должны изменить / изменить свою логику в рамках вашего включенного частичного.

Директивы

С другой стороны, директивы могут иметь явные области видимости / контроллеры / и т. Д. Поэтому, если вы думаете о сценарии, в котором вам придется многократно использовать что-то несколько раз, вы можете увидеть, как подключение собственной области действия сделает жизнь проще и меньше сбивает с толку.

Кроме того, всякий раз, когда вы вообще собираетесь взаимодействовать с DOM, вы должны использовать директиву. Это делает его более удобным для тестирования и отделяет эти действия от контроллера / службы / и т. Д., Что вам нужно!

Совет: убедитесь, что вы не используете restrict: 'E', если вам небезразличен IE8! Есть способы обойти это, но они раздражают. Просто сделайте жизнь проще и придерживайтесь атрибута / и т.д. <div my-directive />

Компоненты [Обновление 01.03.2016]

Добавленный в Angular 1.5, это по сути обертка вокруг .directve(), Компонент должен использоваться большую часть времени. Он удаляет много стандартного кода директивы, по умолчанию на такие вещи, как restrict: 'E', scope : {}, bindToController: true, Я настоятельно рекомендую использовать их практически во всем приложении, чтобы упростить переход на Angular2.

В заключение:

Вы должны создавать Компоненты и Директивы большую часть времени.

  • Более расширяемый
  • Вы можете шаблонировать и иметь свой файл извне (например, ngInclude)
  • Вы можете выбрать использование родительской области или ее отдельной области видимости в директиве.
  • Лучше повторно использовать во всем приложении


Обновление 01.03.2016

Теперь, когда Angular 2 постепенно завершается, и мы знаем, что общий формат (конечно, некоторые изменения будут здесь и там), просто хотел добавить, насколько важно это сделать. components (иногда директивы, если вы хотите, чтобы они были ограничены: например, "E").

Компоненты очень похожи на Angular 2's @Component, Таким образом, мы инкапсулируем логику и HTML в той же области.


Убедитесь, что вы вложили в компоненты столько всего, сколько сможете, это сделает переход на Angular 2 намного проще! (Если вы решили сделать переход)

Вот хорошая статья, описывающая этот процесс миграции с использованием directives (очень похоже, если вы собираетесь использовать компоненты, конечно): http://angular-tips.com/blog/2015/09/migrating-directives-to-angular-2/

Другие вопросы по тегам