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