Necesito realizar algunas operaciones en el alcance y la plantilla. Parece que puedo hacer eso en la link
función o en la controller
función (ya que ambos tienen acceso al alcance).
¿Cuándo es el caso cuando tengo que usar la link
función y no el controlador?
angular.module('myApp').directive('abc', function($timeout) {
return {
restrict: 'EA',
replace: true,
transclude: true,
scope: true,
link: function(scope, elem, attr) { /* link function */ },
controller: function($scope, $element) { /* controller function */ }
};
}
Además, entiendo que link
es el mundo no angular. Entonces, puedo usar $watch
, $digest
y $apply
.
¿Cuál es el significado de la link
función, cuando ya teníamos controlador?
javascript
angularjs
angularjs-directive
Yugal Jindle
fuente
fuente
$watch
,$digest
y$apply
. "?link
no vemos ninguna magia angular. es decir, no hay enlaces de 2 vías, etc. Solo que tenemos la API angular disponible para usar.Respuestas:
Después de mi primera lucha con el
link
ycontroller
funciones y leyendo mucho acerca de ellos, creo que ahora tengo la respuesta.Primero entendamos ,
Cómo funcionan las directivas angulares en pocas palabras:
Comenzamos con una plantilla (como una cadena o cargada en una cadena)
var templateString = '<div my-directive>{{5 + 10}}</div>';
Ahora, esto
templateString
está envuelto como un elemento angularvar el = angular.element(templateString);
Con
el
, ahora lo compilamos$compile
para recuperar la función de enlace .var l = $compile(el)
Esto es lo que pasa
$compile
recorre toda la plantilla y recopila todas las directivas que reconoce.link
funciones.link
funciones se envuelven en una nuevalink
función y se devuelven comol
.Finalmente, proporcionamos
scope
funciones a esta funciónl
(enlace) que ejecuta aún más las funciones de enlace envueltas con estescope
y sus elementos correspondientes.l(scope)
Esto agrega el
template
como un nuevo nodo alDOM
e invoca, locontroller
que agrega sus relojes al alcance que se comparte con la plantilla en DOM.Comparando compilación vs enlace vs controlador :
Cada directiva se compila solo una vez y la función de enlace se conserva para su reutilización. Por lo tanto, si hay algo aplicable a todas las instancias de una directiva, debe realizarse dentro de la
compile
función de la directiva .Ahora, después de la compilación, tenemos una
link
función que se ejecuta al adjuntar la plantilla al DOM . Por lo tanto, realizamos todo lo que es específico para cada instancia de la directiva. Por ejemplo: adjuntar eventos , mutar la plantilla según el alcance , etc.Finalmente, el controlador debe estar disponible para ser vivo y reactivo mientras la directiva funciona en
DOM
(después de adjuntarse). Por lo tanto:(1) Después de configurar la vista [ V ] (es decir, la plantilla) con el enlace.
$scope
es nuestra [ M ] y$controller
es nuestra [ C ] en MVC(2) Aproveche el enlace bidireccional con $ scope configurando relojes.
(3)
$scope
se espera que se agreguen relojes en el controlador ya que esto es lo que está mirando la plantilla durante el tiempo de ejecución.(4) Finalmente,
controller
también se utiliza para poder comunicarse entre directivas relacionadas. (ComomyTabs
ejemplo en https://docs.angularjs.org/guide/directive )(5) Es cierto que podríamos haber hecho todo esto también en la
link
función, pero se trata de la separación de las preocupaciones .Por lo tanto, finalmente tenemos lo siguiente que se adapta perfectamente a todas las piezas:
fuente
Por qué se necesitan controladores
La diferencia entre
link
ycontroller
entra en juego cuando desea anidar directivas en su DOM y exponer las funciones API de la directiva principal a las anidadas.De los documentos :
Supongamos que desea tener dos directivas
my-form
ymy-text-input
desea que lasmy-text-input
directivas aparezcan solo dentromy-form
y en ningún otro lugar.En ese caso, que va a decir mientras se define la directiva
my-text-input
que requiere un controlador delparent
elemento DOM utilizando el argumento requieren, como esto:require: '^myForm'
. Ahora el controlador del elemento padre estaráinjected
en lalink
función como el cuarto argumento, a continuación$scope, element, attributes
. Puede llamar a funciones en ese controlador y comunicarse con la directiva principal.Además, si no se encuentra dicho controlador, se generará un error.
¿Por qué usar link?
No hay una necesidad real de usar la
link
función si se está definiendo,controller
ya que$scope
está disponible encontroller
. Además, al definir amboslink
ycontroller
, uno debe tener cuidado con el orden de invocación de los dos (controller
se ejecuta antes).Sin embargo, de acuerdo con la forma Angular , la mayoría de la manipulación DOM y el uso de enlace bidireccional
$watchers
generalmente se realiza en lalink
función, mientras que la API para niños y la$scope
manipulación se realiza en elcontroller
. Esta no es una regla difícil y rápida, pero hacerlo hará que el código sea más modular y ayudará a separar las preocupaciones (el controlador mantendrá eldirective
estado y lalink
función mantendrá losDOM
enlaces externos +).fuente
link
?controller
? ¿Por qué querré inventar una función completamente nueva solo para evitar definir un controlador?La
controller
función / objeto representa un modelo de abstracción-vista-controlador (MVC). Si bien no hay nada nuevo que escribir sobre MVC, sigue siendo la ventaja más significativa de angular: dividir las preocupaciones en piezas más pequeñas. Y eso es todo, nada más, por lo que si necesita reaccionar ante losModel
cambios que vienen deView
la personaController
adecuada para hacer ese trabajo.La historia sobre la
link
función es diferente, proviene de una perspectiva diferente a la MVC. Y es realmente esencial, una vez que queremos cruzar los límites de unacontroller/model/view
(plantilla) .Vamos a comenzar con los parámetros que se pasan a la
link
función:Para poner el
link
contexto en contexto, debemos mencionar que todas las directivas están pasando por estos pasos del proceso de inicialización: compilar , vincular . Un extracto del libro de Brad Green y Shyam Seshadri Angular JS :Fase de compilación (una hermana de enlace, mencionémosla aquí para obtener una imagen clara):
En esta fase, Angular recorre el DOM para identificar todas las directivas registradas en la plantilla. Para cada directiva, transforma el DOM en función de las reglas de la directiva (plantilla, reemplazar, transcluir, etc.) y llama a la función de compilación si existe. El resultado es una función de plantilla compilada,
Fase de enlace :
Un buen ejemplo de cómo usarlo
link
se puede encontrar aquí: Creación de directivas personalizadas . Vea el ejemplo: Creación de una directiva que manipula el DOM , que inserta una "fecha-hora" en la página, que se actualiza cada segundo.Solo un fragmento muy corto de esa rica fuente anterior, que muestra la manipulación real con DOM. Hay una función enganchada al servicio $ timeout, y también se borra en su llamada destructor para evitar pérdidas de memoria
fuente
compiler
ylink
. Se preguntan por quélink
cuando ya teníamoscontroller
controller
vslink
deberían ser más claros ...link
o alcontroller
.controller
ylink
es relativamente feo. Entonces, el equipo angular debe tener una buena razón para ello en lugar de solo una opción.