Что еще происходит между этими вызовами функций?
Различные функции директив выполнены из двух других в пределах угловых функций , вызываемых $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
В compileAPI выглядит следующим образом:
compile: function compile( tElement, tAttributes ) { ... }
Часто параметры имеют префикс t для обозначения элементов и предоставленных атрибутов, которые относятся к исходному шаблону, а не к экземпляру.
Перед вызовом compileвключенный контент (если есть) удаляется, а шаблон применяется к разметке. Таким образом, элемент, предоставленный compileфункции, будет выглядеть так:
<my-element>
<div>
"{{label}}"
<div ng-transclude></div>
</div>
</my-element>
Обратите внимание, что включенный контент не вставляется повторно в этот момент.
После вызова директивы .compileAngular будет проходить по всем дочерним элементам, включая те, которые могли быть только что введены директивой (например, элементы шаблона).
Создание экземпляра
В нашем случае три экземпляра исходного шаблона выше будут созданы (by ng-repeat). Таким образом, следующая последовательность будет выполняться три раза, один раз за экземпляр.
контроллер
controllerAPI включает в себя:
controller: function( $scope, $element, $attrs, $transclude ) { ... }
При входе в фазу связи функция связи, возвращаемая через $compile, теперь снабжена областью действия.
Во-первых, функция ссылки создает дочернюю область ( scope: true) или изолированную область ( scope: {...}) по запросу.
Затем выполняется контроллер, снабженный областью действия элемента экземпляра.
Pre-ссылка
В pre-linkAPI выглядит следующим образом:
function preLink( scope, element, attributes, controller ) { ... }
Практически ничего не происходит между вызовом директивы .controllerи .preLinkфункции. Angular по-прежнему дают рекомендации относительно того, как каждый из них должен использоваться.
После .preLinkвызова функция link будет проходить через каждый дочерний элемент - вызывая правильную функцию link и присоединяя к ней текущую область (которая служит родительской областью для дочерних элементов).
Пост-ссылка
post-linkAPI аналогичен из 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>