Когда вы создаете директиву, вы можете поместить код в компилятор, функцию ссылки или контроллер.
В документах они объясняют, что:
- Функция компиляции и ссылки используется в разных фазах углового цикла
- контроллеры распределяются между директивами
Однако для меня не ясно, какой код должен идти куда.
Например: я могу создать функции в компиляции и прикрепить их к области в ссылке или только прикрепить функции к области в контроллере?
Как контроллеры распределяются между директивами, если каждая директива может иметь свой собственный контроллер? Контроллеры действительно общие или это просто свойства области видимости?
angularjs
angularjs-directive
schacki
источник
источник
Ответы:
Компилировать:
На этом этапе Angular фактически компилирует вашу директиву. Эта функция компиляции вызывается только один раз для каждой ссылки на данную директиву. Например, скажем, вы используете директиву ng-repeat. ng-repeat придется искать элемент, к которому он прикреплен, извлекать фрагмент html, к которому он прикреплен, и создавать функцию шаблона.
Если вы использовали HandleBars, шаблоны подчеркивания или аналогичные, это все равно что компилировать их шаблоны для извлечения функции шаблона. В эту функцию шаблона вы передаете данные, и возвращаемое значение этой функции - HTML-код с данными в нужных местах.
Фаза компиляции - это тот шаг в Angular, который возвращает функцию шаблона. Эта шаблонная функция в угловой называется связующей функцией.
Фаза связывания:
На этапе связывания вы присоединяете данные ($ scope) к функции связывания, и она должна вернуть вам связанный HTML. Так как директива также указывает, куда этот html идет или что он меняет, это уже хорошо. Это функция, в которой вы хотите внести изменения в связанный HTML, то есть в HTML, к которому уже прикреплены данные. В угловом, если вы пишете код в функции связывания, это обычно функция post-link (по умолчанию). Это своего рода обратный вызов, который вызывается после того, как функция связывания связала данные с шаблоном.
Контроллер:
Контроллер - это место, где вы вводите некоторую директиву определенной логики. Эта логика также может входить в функцию связывания, но тогда вам придется поместить эту логику в область действия, чтобы сделать ее «разделяемой». Проблема в том, что вы тогда испортили бы область действия своими директивами, что на самом деле не то, что ожидается. Так какой же вариант, если две директивы хотят общаться друг с другом / сотрудничать друг с другом? Конечно, вы можете поместить всю эту логику в службу, а затем сделать обе эти директивы зависимыми от этой службы, но это просто добавляет еще одну зависимость. Альтернативой является предоставление Контроллера для этой области (обычно изолировать область?), А затем этот контроллер вводится в другую директиву, когда эта директива «требует» другую.
источник
controller
функции выполняется после компиляции, но до этогоpre-link
в локальной ветви дерева DOM. Такжеcontroller
иpre-link
функции выполняются через локальную ветвь DOM сверху вниз . После этогоpost-link
выполняется снизу вверх .controller
вместоlink
везде? Так что мне не нужно менять код в будущем, если метод должен использоваться совместно или вводиться некоторая логика? Есть ли какие-либо подводные камни в использованииcontroller
все время вместо ссылки?Я хотел бы добавить также то, что говорится в книге O'Reily AngularJS от команды Google:
источник
A
directive
позволяет расширять словарный запас HTML декларативным способом для создания веб-компонентов.ng-app
Атрибут является директивой, такng-controller
и всеng- prefixed attributes
. Директивы могут бытьattributes
,tags
или дажеclass
names
,comments
.Как рождаются директивы (
compilation
иinstantiation
)Компиляция: мы будем использовать
compile
функцию какmanipulate
для DOM до ее рендеринга, так и для возвратаlink
функции (которая будет обрабатывать ссылки для нас). Это также место для размещения любых методов, которыми нужно поделиться со всейinstances
этой директивой.ссылка: Мы будем использовать
link
функцию для регистрации всех слушателей на конкретном элементе DOM (который клонирован из шаблона) и настроим наши привязки к странице.Если установлено в
объекте.
compile()
функции, они были бы установлены только один раз (что часто является тем, что вы хотите). Если установлено вlink()
функции, они будут установлены каждый раз, когда элемент HTML привязан к данным вCompile
Функция возвращает функциюpre
иpost
ссылку. В функции предварительной ссылки у нас есть шаблон экземпляра, а также область действия изcontroller
, но шаблон не привязан к области действия и по-прежнему не имеет включенного содержимого.Post
Функция link - это то, где post link является последней функцией, которая будет выполнена. Теперьtransclusion
завершеноthe template is linked to a scope
, иview will update with data bound values after the next digest cycle
. Этаlink
опция является просто ярлыком для настройкиpost-link
функции.контроллер: контроллер директивы может быть передан в другую фазу соединения / компиляции директивы. Он может быть введен в другие направления в качестве средства для использования в межправительственной связи.
Вы должны указать имя требуемой директивы - она должна быть связана с тем же элементом или его родителем. Имя может начинаться с префикса:
Используйте квадратную скобку,
[‘directive1′, ‘directive2′, ‘directive3′]
чтобы требовать нескольких директив контроллера.источник
Кроме того, хорошей причиной для использования функции «контроллер против связи» (поскольку они оба имеют доступ к области, элементу и атрибутам) является то, что вы можете передать любую доступную службу или зависимость в контроллер (и в любом порядке), тогда как Вы не можете сделать это с помощью функции ссылки. Обратите внимание на разные подписи:
против
источник
module.directive('myDirective', function($window) { etc...
. Затем можно получить доступ из функции ссылки.это хороший пример для понимания этапов директивы http://codepen.io/anon/pen/oXMdBQ?editors=101
HTML
источник
link
,compile
иcontroller
?require
директива d может быть введена в контроллер зависимой директивы?источник