¿Qué más sucede entre estas llamadas a funciones?
Las diversas funciones directivas se ejecutan desde dentro de otras dos funciones angulares llamados $compile
(donde la directiva de compile
se ejecuta) y una función interna llamada nodeLinkFn
(donde el de directiva controller
, preLink
y postLink
se ejecutan). Suceden varias cosas dentro de la función angular antes y después de que se invocan las funciones directivas. Quizás lo más notable es la recursividad infantil. La siguiente ilustración simplificada muestra los pasos clave dentro de las fases de compilación y enlace:
Para demostrar estos pasos, usemos el siguiente marcado HTML:
<div ng-repeat="i in [0,1,2]">
<my-element>
<div>Inner content</div>
</my-element>
</div>
Con la siguiente directiva:
myApp.directive( 'myElement', function() {
return {
restrict: 'EA',
transclude: true,
template: '<div>{{label}}<div ng-transclude></div></div>'
}
});
Compilar
La compile
API se ve así:
compile: function compile( tElement, tAttributes ) { ... }
A menudo, los parámetros tienen el prefijo t
para indicar que los elementos y atributos proporcionados son los de la plantilla de origen, en lugar de los de la instancia.
Antes de la llamada al compile
contenido transcluido (si lo hay) se elimina, y la plantilla se aplica al marcado. Por lo tanto, el elemento proporcionado a la compile
función se verá así:
<my-element>
<div>
"{{label}}"
<div ng-transclude></div>
</div>
</my-element>
Observe que el contenido transcluido no se vuelve a insertar en este momento.
Siguiendo la llamada a las directivas .compile
, Angular atravesará todos los elementos secundarios, incluidos los que pueden haber sido introducidos por la directiva (los elementos de plantilla, por ejemplo).
Creación de instancia
En nuestro caso, se crearán tres instancias de la plantilla fuente anterior (por ng-repeat
). Por lo tanto, la siguiente secuencia se ejecutará tres veces, una por instancia.
Controlador
La controller
API implica:
controller: function( $scope, $element, $attrs, $transclude ) { ... }
Al ingresar a la fase de enlace, la función de enlace devuelta a través de $compile
ahora se proporciona con un alcance.
Primero, la función de enlace crea un ámbito secundario ( scope: true
) o un ámbito aislado ( scope: {...}
) si se solicita.
Luego se ejecuta el controlador, provisto con el alcance del elemento de instancia.
Preenlace
La pre-link
API se ve así:
function preLink( scope, element, attributes, controller ) { ... }
Prácticamente no sucede nada entre la llamada a las directivas .controller
y la .preLink
función. Angular todavía proporciona recomendaciones sobre cómo se debe usar cada una.
Después de la .preLink
llamada, la función de enlace atravesará cada elemento secundario: llamará a la función de enlace correcta y le asignará el alcance actual (que sirve como el alcance principal para los elementos secundarios).
Post-enlace
La post-link
API es similar a la de la pre-link
función:
function postLink( scope, element, attributes, controller ) { ... }
Quizás valga la pena notar que una vez que .postLink
se llama a la función de una directiva , el proceso de enlace de todos sus elementos hijos se ha completado, incluidas todas las .postLink
funciones infantiles .
Esto significa que cuando .postLink
se llama, los niños están "vivos" y listos. Esto incluye:
- el enlace de datos
- transclusión aplicada
- alcance adjunto
La plantilla en esta etapa se verá así:
<my-element>
<div class="ng-binding">
"{{label}}"
<div ng-transclude>
<div class="ng-scope">Inner content</div>
</div>
</div>
</my-element>