¿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 compilese ejecuta) y una función interna llamada nodeLinkFn(donde el de directiva controller, preLinky postLinkse 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 compileAPI 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 compilecontenido transcluido (si lo hay) se elimina, y la plantilla se aplica al marcado. Por lo tanto, el elemento proporcionado a la compilefunció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 controllerAPI implica:
controller: function( $scope, $element, $attrs, $transclude ) { ... }
Al ingresar a la fase de enlace, la función de enlace devuelta a través de $compileahora 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-linkAPI se ve así:
function preLink( scope, element, attributes, controller ) { ... }
Prácticamente no sucede nada entre la llamada a las directivas .controllery la .preLinkfunción. Angular todavía proporciona recomendaciones sobre cómo se debe usar cada una.
Después de la .preLinkllamada, 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-linkAPI es similar a la de la pre-linkfunción:
function postLink( scope, element, attributes, controller ) { ... }
Quizás valga la pena notar que una vez que .postLinkse llama a la función de una directiva , el proceso de enlace de todos sus elementos hijos se ha completado, incluidas todas las .postLinkfunciones infantiles .
Esto significa que cuando .postLinkse 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>