Cos'altro succede tra queste chiamate di funzione?
Le varie funzioni direttive vengono eseguite dall'interno di altri due funzioni angolari chiamate $compile
(quando la direttiva del compile
viene eseguita) e una funzione interna chiamata nodeLinkFn
(dove della direttiva controller
, preLink
e postLink
vengono eseguiti). Varie cose accadono all'interno della funzione angolare prima e dopo che le funzioni direttive sono chiamate. Forse in particolare è la ricorsione del bambino. La seguente illustrazione semplificata mostra i passaggi chiave nelle fasi di compilazione e collegamento:
Per dimostrare questi passaggi, utilizziamo il seguente markup HTML:
<div ng-repeat="i in [0,1,2]">
<my-element>
<div>Inner content</div>
</my-element>
</div>
Con la seguente direttiva:
myApp.directive( 'myElement', function() {
return {
restrict: 'EA',
transclude: true,
template: '<div>{{label}}<div ng-transclude></div></div>'
}
});
Compilare
L' compile
API si presenta così:
compile: function compile( tElement, tAttributes ) { ... }
Spesso ai parametri viene aggiunto il prefisso t
per indicare che gli elementi e gli attributi forniti sono quelli del modello di origine, piuttosto che quello dell'istanza.
Prima della chiamata al compile
contenuto escluso (se presente) viene rimosso e il modello viene applicato al markup. Pertanto, l'elemento fornito alla compile
funzione sarà simile al seguente:
<my-element>
<div>
"{{label}}"
<div ng-transclude></div>
</div>
</my-element>
Si noti che il contenuto escluso non viene reinserito a questo punto.
A seguito della chiamata alla direttiva .compile
, Angular attraverserà tutti gli elementi figlio, compresi quelli che potrebbero essere stati appena introdotti dalla direttiva (gli elementi del modello, ad esempio).
Creazione dell'istanza
Nel nostro caso, verranno create tre istanze del modello di origine sopra (di ng-repeat
). Pertanto, la seguente sequenza verrà eseguita tre volte, una volta per istanza.
controllore
L' controller
API prevede:
controller: function( $scope, $element, $attrs, $transclude ) { ... }
Entrando nella fase di collegamento, la funzione di collegamento restituita tramite $compile
ora è dotata di un ambito.
Innanzitutto, la funzione di collegamento crea un ambito figlio ( scope: true
) o un ambito isolato ( scope: {...}
) se richiesto.
Il controller viene quindi eseguito, fornito con l'ambito dell'elemento istanza.
Pre-link
L' pre-link
API si presenta così:
function preLink( scope, element, attributes, controller ) { ... }
Praticamente non succede nulla tra la chiamata alla direttiva .controller
e la .preLink
funzione. Angular fornisce ancora raccomandazioni su come utilizzare ciascuna.
A seguito della .preLink
chiamata, la funzione di collegamento attraverserà ciascun elemento figlio, chiamando la funzione di collegamento corretta e collegando ad esso l'ambito corrente (che funge da ambito padre per gli elementi figlio).
Post-Link
L' post-link
API è simile a quella della pre-link
funzione:
function postLink( scope, element, attributes, controller ) { ... }
Forse vale la pena notare che una volta .postLink
chiamata la funzione di una direttiva , il processo di collegamento di tutti i suoi elementi figlio è stato completato, comprese tutte le .postLink
funzioni dei bambini .
Ciò significa che quando .postLink
viene chiamato, i bambini sono "vivi" pronti. Ciò comprende:
- associazione dati
- trasclusione applicata
- ambito allegato
Il modello in questa fase apparirà così:
<my-element>
<div class="ng-binding">
"{{label}}"
<div ng-transclude>
<div class="ng-scope">Inner content</div>
</div>
</div>
</my-element>