Cuando crea una directiva, puede poner código en el compilador, la función de enlace o el controlador.
En los documentos, explican que:
- La función de compilación y enlace se utiliza en diferentes fases del ciclo angular.
- los controladores se comparten entre directivas
Sin embargo, para mí no está claro, qué tipo de código debería ir a dónde.
Por ejemplo: ¿Puedo crear funciones en compilación y adjuntarlas al alcance en el enlace o solo adjuntar funciones al alcance en el controlador?
¿Cómo se comparten los controladores entre las directivas, si cada directiva puede tener su propio controlador? ¿Los controladores realmente se comparten o son solo las propiedades del alcance?
angularjs
angularjs-directive
schacki
fuente
fuente
Respuestas:
Compilar:
Esta es la fase en la que Angular realmente compila su directiva. Esta función de compilación se llama solo una vez para cada referencia a la directiva dada. Por ejemplo, supongamos que está utilizando la directiva ng-repeat. ng-repeat tendrá que buscar el elemento al que está adjunto, extraer el fragmento html al que está adjunto y crear una función de plantilla.
Si ha utilizado HandleBars, subrayar plantillas o equivalentes, es como compilar sus plantillas para extraer una función de plantilla. Para esta función de plantilla, pasa datos y el valor de retorno de esa función es el html con los datos en los lugares correctos.
La fase de compilación es ese paso en Angular que devuelve la función de plantilla. Esta función de plantilla en angular se llama función de enlace.
Fase de enlace:
La fase de vinculación es donde adjunta los datos ($ scope) a la función de vinculación y debe devolverle el html vinculado. Dado que la directiva también especifica dónde va este html o qué cambia, ya es bueno ir. Esta es la función en la que desea realizar cambios en el html vinculado, es decir, el html que ya tiene los datos adjuntos. En angular, si escribe código en la función de enlace, generalmente es la función posterior al enlace (por defecto). Es una especie de devolución de llamada que se llama después de que la función de vinculación ha vinculado los datos con la plantilla.
Controlador :
El controlador es un lugar donde pones alguna lógica específica de directiva. Esta lógica también puede entrar en la función de vinculación, pero luego tendrías que poner esa lógica en el alcance para que sea "compartible". El problema con eso es que estarías corrompiendo el alcance con tus directivas, lo cual no es realmente algo que se espera. Entonces, ¿cuál es la alternativa si dos Directivas quieren hablar entre ellas / cooperar entre ellas? Por supuesto, podría poner toda esa lógica en un servicio y luego hacer que ambas directivas dependan de ese servicio, pero eso solo trae una dependencia más. La alternativa es proporcionar un controlador para este alcance (¿generalmente aislar el alcance?) Y luego este controlador se inyecta en otra directiva cuando esa directiva "requiere" la otra.
fuente
controller
función directiva se ejecuta después de la compilación, pero antespre-link
en una rama de árbol DOM local. Tambiéncontroller
ypre-link
funciones se ejecutan atraviesa la rama DOM local en una de arriba hacia abajo de forma. Después de esopost-link
se ejecuta de manera ascendente .controller
lugar de enlink
todas partes? ¿De modo que no necesito cambiar el código en el futuro si es necesario compartir el método o introducir alguna lógica? ¿Hay algún inconveniente en usarcontroller
todo el tiempo en lugar del enlace?Quería agregar también lo que el libro O'Reily AngularJS del Equipo de Google tiene que decir:
fuente
A le
directive
permite ampliar el vocabulario HTML de manera declarativa para crear componentes web. Elng-app
atributo es una directiva, también lo esng-controller
y todos losng- prefixed attributes
. Las directivas pueden serattributes
,tags
o inclusoclass
names
,comments
.Cómo nacen las directivas (
compilation
yinstantiation
)Compilar: Utilizaremos la
compile
función tanto paramanipulate
el DOM antes de que se procese como para devolver unalink
función (que se encargará de la vinculación por nosotros). Este también es el lugar para colocar cualquier método que deba compartirse con todos losinstances
esta directiva.enlace: Utilizaremos la
link
función para registrar a todos los oyentes en un elemento DOM específico (que se clona desde la plantilla) y configurar nuestros enlaces a la página.Si se configuran en la
objeto.
compile()
función, solo se habrían configurado una vez (que a menudo es lo que desea). Si se establece en lalink()
función, se establecerían cada vez que el elemento HTML se vincule a los datos delCompile
La función devuelve la funciónpre
ypost
enlace. En la función de preenlace tenemos la plantilla de instancia y también el alcance decontroller
, pero la plantilla no está vinculada al alcance y aún no tiene contenido translúcido.Post
La función de enlace es donde el enlace de publicación es la última función que se ejecuta. Ahora eltransclusion
está completothe template is linked to a scope
, y elview will update with data bound values after the next digest cycle
. Lalink
opción es solo un atajo para configurar unapost-link
función.controlador: el controlador de la directiva se puede pasar a otra fase de vinculación / compilación de la directiva. Se puede inyectar en otros directorios como un medio para usar en la comunicación inter-directiva.
Debe especificar el nombre de la directiva que se requiere: debe estar vinculada al mismo elemento o su elemento primario. El nombre puede tener como prefijo:
Use corchetes
[‘directive1′, ‘directive2′, ‘directive3′]
para requerir múltiples directivas de controlador.fuente
Además, una buena razón para usar una función de controlador vs.enlace (ya que ambos tienen acceso al alcance, elemento y atributos) es porque puede transferir cualquier servicio o dependencia disponible a un controlador (y en cualquier orden), mientras que no puedes hacer eso con la función de enlace. Observe las diferentes firmas:
vs.
fuente
module.directive('myDirective', function($window) { etc...
. Esto se puede acceder desde dentro de la función de enlace.Esta es una buena muestra para comprender las fases de la directiva http://codepen.io/anon/pen/oXMdBQ?editors=101
html
fuente
link
,compile
ycontroller
?require
se puede inyectar una directiva d en el controlador de una directiva dependiente?fuente