Al escribir una directiva angular, uno puede usar cualquiera de las siguientes funciones para manipular el comportamiento DOM, el contenido y la apariencia del elemento en el que se declara la directiva:
- compilar
- controlador
- preenlace
- post-enlace
Parece haber cierta confusión acerca de qué función se debe usar. Esta pregunta cubre:
Directiva básica
- ¿Cómo declarar las diversas funciones?
- ¿Cuál es la diferencia entre una plantilla fuente y una plantilla de instancia ?
- ¿En qué orden se ejecutan las funciones directivas?
- ¿Qué más sucede entre estas llamadas a funciones?
Función naturaleza, qué hacer y qué no hacer
Preguntas relacionadas:
- Directiva: enlace vs compilación vs controlador .
- Diferencia entre las funciones 'controlador', 'enlace' y 'compilación' al definir una directiva angular.js .
- ¿Cuál es la diferencia entre compilar y enlazar en angularjs ?
- ¿Diferencia entre el elemento precompilación y postcompilación en las directivas AngularJS? .
- Directiva JS angular: ¿plantilla, compilación o enlace? .
- post link vs pre link en las directivas Angular js .
angularjs
angularjs-directive
Izhaki
fuente
fuente
Respuestas:
¿En qué orden se ejecutan las funciones directivas?
Para una sola directiva
Basado en el siguiente plunk , considere el siguiente marcado HTML:
Con la siguiente declaración de directiva:
La salida de la consola será:
Podemos ver que
compile
se ejecuta primero, luegocontroller
, luegopre-link
y el último espost-link
.Para directivas anidadas
El marcado HTML original a menudo está hecho de elementos anidados, cada uno con su propia directiva. Como en el siguiente marcado (ver plunk ):
La salida de la consola se verá así:
Aquí podemos distinguir dos fases: la fase de compilación y el enlace. fase de .
La fase de compilación
Cuando se carga el DOM, Angular comienza la fase de compilación, donde atraviesa el marcado de arriba hacia abajo y llama
compile
a todas las directivas. Gráficamente, podríamos expresarlo así:Quizás sea importante mencionar que en esta etapa, las plantillas que obtiene la función de compilación son las plantillas de origen (no la plantilla de instancia).
La fase de enlace
Las instancias DOM a menudo son simplemente el resultado de una plantilla fuente que se representa en el DOM, pero pueden ser creadas por
ng-repeat
o introducidas sobre la marcha.Cada vez que se representa una nueva instancia de un elemento con una directiva en el DOM, comienza la fase de enlace.
En esta fase, Angular llama
controller
,pre-link
itera hijos y llamapost-link
a todas las directivas, así:fuente
¿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 decompile
se ejecuta) y una función interna llamadanodeLinkFn
(donde el de directivacontroller
,preLink
ypostLink
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:
Con la siguiente directiva:
Compilar
La
compile
API se ve así: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 lacompile
función se verá así: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: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í: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 lapre-link
función: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:La plantilla en esta etapa se verá así:
fuente
¿Cómo declarar las diversas funciones?
Compilar, Controlador, Preenlace y Postenlace
Si se van a utilizar las cuatro funciones, la directiva seguirá este formulario:
Tenga en cuenta que compilar devuelve un objeto que contiene las funciones de preenlace y postenlace; En la jerga angular, decimos que la función de compilación devuelve una función de plantilla .
Compilación, controlador y post-enlace
Si
pre-link
no es necesario, la función de compilación simplemente puede devolver la función de enlace posterior en lugar de un objeto de definición, de esta manera:A veces, uno desea agregar un
compile
método, después de quelink
se definió el método (post) . Para esto, uno puede usar:Controlador y post-enlace
Si no se necesita una función de compilación, se puede omitir su declaración por completo y proporcionar la función de enlace posterior bajo la
link
propiedad del objeto de configuración de la directiva:Sin controlador
En cualquiera de los ejemplos anteriores, uno simplemente puede eliminar la
controller
función si no es necesario. Entonces, por ejemplo, si solopost-link
se necesita una función, uno puede usar:fuente
¿Cuál es la diferencia entre una plantilla fuente y una plantilla de instancia ?
El hecho de que Angular permita la manipulación DOM significa que el marcado de entrada en el proceso de compilación a veces difiere de la salida. En particular, algunas marcas de entrada pueden clonarse varias veces (como con
ng-repeat
) antes de representarse en el DOM.La terminología angular es un poco inconsistente, pero aún distingue entre dos tipos de marcas:
El siguiente marcado demuestra esto:
La fuente html define
que sirve como plantilla de origen.
Pero como está envuelto dentro de una
ng-repeat
directiva, esta plantilla fuente será clonada (3 veces en nuestro caso). Estos clones son una plantilla de instancia, cada uno aparecerá en el DOM y estará vinculado al ámbito relevante.fuente
Función de compilación
Cada directiva
compile
función de solo se llama una vez, cuando los bootstraps angulares.Oficialmente, este es el lugar para realizar manipulaciones de plantilla (fuente) que no involucran alcance o enlace de datos.
Principalmente, esto se hace con fines de optimización; considere el siguiente marcado:
La
<my-raw>
directiva representará un conjunto particular de marcado DOM. Entonces podemos:ng-repeat
duplicar la plantilla de origen (<my-raw>
) y luego modifique el marcado de cada plantilla de instancia (fuera de lacompile
función).compile
función) y luego permitang-repeat
duplicarlo.Si hay 1000 elementos en la
raws
colección, la última opción puede ser más rápida que la anterior.Hacer:
No haga
fuente
Función de controlador
La
controller
función de cada directiva se llama cada vez que se crea una instancia de un nuevo elemento relacionado.Oficialmente, la
controller
función es donde uno:Nuevamente, es importante recordar que si la directiva involucra un alcance aislado, las propiedades dentro de ella que heredan del alcance padre aún no están disponibles.
Hacer:
No haga:
fuente
Función de post-enlace
Cuando
post-link
se llama a la función, se han realizado todos los pasos anteriores: enlace, transclusión, etc.Este suele ser un lugar para manipular aún más el DOM representado.
Hacer:
fuente
Función de preenlace
La
pre-link
función de cada directiva se llama cada vez que se crea una instancia de un nuevo elemento relacionado.Como se vio anteriormente en la sección de orden de compilación, las
pre-link
funciones se llaman padre-luego-hijo, mientras que laspost-link
funciones se llamanchild-then-parent
.La
pre-link
función rara vez se usa, pero puede ser útil en escenarios especiales; por ejemplo, cuando un controlador secundario se registra con el controlador principal, pero el registro tiene que ser de unaparent-then-child
manera (ngModelController
hace las cosas de esta manera).No haga:
fuente