Что еще происходит между этими вызовами функций?
Различные функции директив выполнены из двух других в пределах угловых функций , вызываемых $compile
(где директива compile
выполняются) и внутренняя функцией , называемой nodeLinkFn
(где директивы controller
, preLink
и postLink
исполняются). В угловой функции происходят разные вещи до и после вызова директивных функций. Возможно, наиболее заметно это рекурсия ребенка. На следующем упрощенном рисунке показаны основные этапы на этапах компиляции и компоновки:
Чтобы продемонстрировать эти шаги, давайте используем следующую разметку HTML:
<div ng-repeat="i in [0,1,2]">
<my-element>
<div>Inner content</div>
</my-element>
</div>
Со следующей директивой:
myApp.directive( 'myElement', function() {
return {
restrict: 'EA',
transclude: true,
template: '<div>{{label}}<div ng-transclude></div></div>'
}
});
Compile
В compile
API выглядит следующим образом:
compile: function compile( tElement, tAttributes ) { ... }
Часто параметры имеют префикс t
для обозначения элементов и предоставленных атрибутов, которые относятся к исходному шаблону, а не к экземпляру.
Перед вызовом compile
включенный контент (если есть) удаляется, а шаблон применяется к разметке. Таким образом, элемент, предоставленный compile
функции, будет выглядеть так:
<my-element>
<div>
"{{label}}"
<div ng-transclude></div>
</div>
</my-element>
Обратите внимание, что включенный контент не вставляется повторно в этот момент.
После вызова директивы .compile
Angular будет проходить по всем дочерним элементам, включая те, которые могли быть только что введены директивой (например, элементы шаблона).
Создание экземпляра
В нашем случае три экземпляра исходного шаблона выше будут созданы (by ng-repeat
). Таким образом, следующая последовательность будет выполняться три раза, один раз за экземпляр.
контроллер
controller
API включает в себя:
controller: function( $scope, $element, $attrs, $transclude ) { ... }
При входе в фазу связи функция связи, возвращаемая через $compile
, теперь снабжена областью действия.
Во-первых, функция ссылки создает дочернюю область ( scope: true
) или изолированную область ( scope: {...}
) по запросу.
Затем выполняется контроллер, снабженный областью действия элемента экземпляра.
Pre-ссылка
В pre-link
API выглядит следующим образом:
function preLink( scope, element, attributes, controller ) { ... }
Практически ничего не происходит между вызовом директивы .controller
и .preLink
функции. Angular по-прежнему дают рекомендации относительно того, как каждый из них должен использоваться.
После .preLink
вызова функция link будет проходить через каждый дочерний элемент - вызывая правильную функцию link и присоединяя к ней текущую область (которая служит родительской областью для дочерних элементов).
Пост-ссылка
post-link
API аналогичен из pre-link
функции:
function postLink( scope, element, attributes, controller ) { ... }
Возможно, стоит заметить, что после вызова .postLink
функции директивы процесс связывания всех ее дочерних элементов завершен, включая все дочерние .postLink
функции.
Это значит, что к тому времени, когда .postLink
звонят, дети «вживую» готовы. Это включает в себя:
- привязка данных
- применяется включение
- объем прилагается
Шаблон на этом этапе будет выглядеть так:
<my-element>
<div class="ng-binding">
"{{label}}"
<div ng-transclude>
<div class="ng-scope">Inner content</div>
</div>
</div>
</my-element>