Algunos lugares parecen usar la función del controlador para la lógica directiva y otros usan el enlace. El ejemplo de pestañas en la página de inicio angular usa el controlador para uno y el enlace para otra directiva. ¿Cuál es la diferencia entre los dos?
Voy a ampliar un poco tu pregunta y también incluiré la función de compilación.
función de compilación - use para template DOM manipulation (es decir, manipulación de tElement = template elemento), por lo tanto, manipulaciones que se aplican a todos los clones DOM de la plantilla asociada con la directiva. (Si también necesita una función de enlace (o funciones de enlace anteriores y posteriores), y definió una función de compilación, la función de compilación debe devolver la (s) función (es) de enlace porque el atributo 'link'
se ignora si se define el atributo 'compile'
.)
función de enlace: normalmente se utiliza para registrar devoluciones de llamada de oyentes (es decir, $watch
expresiones en el alcance), así como para actualizar el DOM (es decir, la manipulación de iElement = elemento de instancia individual). Se ejecuta después de que la plantilla ha sido clonada. Por ejemplo, dentro de un <li ng-repeat...>
, la función de enlace se ejecuta después de que la plantilla <li>
(tElement) se haya clonado (en un iElement) para ese elemento <li>
en particular. Un $watch
permite que una directiva sea notificada de los cambios en las propiedades del alcance (un alcance está asociado con cada instancia), lo que permite que la directiva presente un valor de instancia actualizado al DOM.
función del controlador - debe usarse cuando otra directiva necesita interactuar con esta directiva. Por ejemplo, en la página de inicio de AngularJS, la directiva de panel debe agregarse al ámbito mantenido por la directiva de pestañas, por lo que la directiva de pestañas debe definir un método de controlador (piense en la API) al que la directiva de panel puede acceder/llamar.
Para obtener una explicación más detallada de las directivas de pestañas y paneles, y por qué la directiva de pestañas crea una función en su controlador usando this
(en lugar de $scope
), consulte 'this' vs $ scope in Controladores AngularJS .
En general, puede poner los métodos, $watches
, etc. en el controlador de la directiva o en la función de enlace. El controlador se ejecutará primero, lo que a veces es importante (consulte este violín que se registra cuando las funciones de control y enlace se ejecutan con dos directivas anidadas). Como Josh mencionó en un comentario , es posible que desee colocar funciones de manipulación de alcance dentro de un controlador solo para mantener la coherencia con el resto del marco.
Como complemento de la respuesta de Mark, la función de compilación no tiene acceso al alcance, pero sí la función de enlace.
Realmente recomiendo este video; Directivas de escritura por Misko Hevery (el padre de AngularJS), donde describe las diferencias y algunas técnicas. (Diferencia entre la función de compilación y la función de enlace en la marca 14:41 en el video ).
Convención angular: escriba la lógica de negocios en el controlador y la manipulación de DOM en el enlace.
Aparte de esto, puede llamar a una función de controlador desde la función de enlace de otra directiva. Por ejemplo, tiene 3 directivas personalizadas
<animal>
<panther>
<leopard></leopard>
</panther>
</animal>
y quieres acceder al animal desde dentro de la directiva "leopard".
http://egghead.io/lessons/angularjs-directive-communication será útil saber acerca de la comunicación entre directivas
compilar la función -
sintaxis
function compile(tElement, tAttrs, transclude) { ... }
controlador
Pre - enlace
La función de enlace es responsable de registrar los escuchas de DOM y de actualizar el DOM. Se ejecuta después de que la plantilla ha sido clonada. Aquí es donde se pondrá la mayor parte de la lógica directiva.
Puede actualizar el dom en el controlador usando angular.element pero esto no se recomienda ya que el elemento se proporciona en la función de enlace
La función de enlace previo se usa para implementar la lógica que se ejecuta cuando angular js ya ha compilado los elementos secundarios, pero antes de que se haya llamado a cualquiera de los enlaces posteriores del elemento secundario
post-link
directiva que solo tiene función de enlace, angular trata la función como un enlace posterior.
la publicación se ejecutará después de la compilación, el controlador y la función de enlace previo, por lo que este es el lugar más seguro y predeterminado para agregar la lógica directiva.