2012-07-29 13 views
6
angular.directive('ppd:reset', function(e1,e2) { 
    return function(linkElement) {  
     linkElement.wrap().... 
     }); 
    }; 
}); 

YDiferentes tipos de patrones angular Directivas

angular.directive('ppd:reset', [function() { 
     return function(scope, elm, attrs) { } 

}]); 

¿Cuál es la diferencia entre estos dos directivas patrón?

Respuesta

17

Si declara sus fábricas con la notación de corchetes, puede evitar problemas cuando minifying su código:

angular.directive('ppd:reset', ["$compile", function(compile) { 
    return function(scope, elm, attrs) { } 

}]); 

El inyector mira a sus nombres de los parámetros de función con el fin de saber qué se inyectan. Si un proceso de minificación cambia el nombre, el inyector ya no sabe qué hacer. La minificación, por supuesto, no tocará los valores de cadena, por lo que la notación de matriz funciona bien.

+2

Puede encontrarlo en la documentación DI en el título "Anotación en línea" http://docs.angularjs.org/guide/di#inlineannotation – Oliver

+0

Bueno, también puede usar la sintaxis menos detallada y analizar fuente con ngMin :) https : //github.com/btford/ngmin –

4

La diferencia es que la versión n. ° 1 es una forma simple de que angular admite directivas de escritura que no requieren ningún módulo inyectable. La versión n. ° 2 es para inyectables. Entonces, digamos que su directiva dependía del $ timeout service, entonces tendría una definición como la siguiente. Para mí, es más fácil no pensar y simplemente usar la sintaxis de matriz, incluso si no hay inyectables.

angular.directive('ppd:reset', ['$timeout', function($timeout) { 
     return function(scope, elm, attrs) { } 
}]); 
+1

Angular sigue haciendo inyección de dependencia en ambas formas. La diferencia está en el manejo de la minificación como implica la otra respuesta. – markt

+0

Estoy de acuerdo con el comentario de minificación, sin embargo, la publicación original era (cuando lo leí) sobre tener una matriz y no tener una matriz. No había pensado en mencionar el bit de la minificación. No veo cómo mi respuesta es incorrecta. –

+0

Su respuesta a toda prueba dice que la primera sintaxis es para escribir directivas que no requieren inyección ... pero eso no es cierto. Angular intentará inyectar dependencias para ambos. – markt

0

La diferencia entre los dos es que la notación del soporte [] es a prueba de minúsculos ya que los minificadores no minimizan las cadenas. Por ejemplo, si intenta minify JavaScript sin ella, se encenderá:

angular.module('myApp', []) 
.controller('MainController', function($scope) { 
}); 

en

angular.module("myApp",[]).controller("MainController",function(e){}) 

El problema en este caso es que Angular no sabe nada acerca de e en lugar de $scope, que sí conoce. Usando la notación de corchetes [], podemos decirle al $injector de antemano a qué queremos que acceda el controlador. Dado que los minificadores no minimizan (y no pueden) las cadenas, es una forma segura de utilizar la función de inyección de dependencias de característica de Angular con o sin minificadores.

Para una comprensión más profunda de las diferencias de sintaxis, puede consultar ng-book (https://www.ng-book.com/). Descargo de responsabilidad, soy el autor del libro y de http://www.ng-newsletter.com/.

Cuestiones relacionadas