javascript - otro - ng controller que es
AngularJS-dependencias de módulos, nomenclatura de nombres (2)
Dado que no existe un espaciado de nombres integrado de los módulos (o componentes de los módulos), la mejor manera de lograr su objetivo es utilizar una convención de nomenclatura única para sus módulos. La mayoría de las bibliotecas para angular hacen esto, y entonces deberías estar listo para empezar.
Además de encapsular el comportamiento de sus aplicaciones, los módulos ayudan a probar y burlarse de su aplicación.
No creo que sea posible para angular distinguir entre dos componentes que reciben el mismo nombre (creo que esto cambia con angular 2). Y podría argumentar que dos componentes que se nombran igual podrían hacer lo mismo y debería ver por qué necesita ambos?
Tengo dos módulos de terceros , ambos definen una fábrica con el mismo nombre. Obviamente, no tengo ningún control sobre el nombramiento de esos módulos sin recurrir a un kludge.
Además, tengo dos módulos internos adicionales, cada uno usando uno diferente de los dos módulos de terceros como una dependencia (como a continuación). Estaba seguro de que no podía acceder a los componentes de un módulo que no figuraba en las dependencias del módulo actual, pero resultó que estaba equivocado.
Aquí incluso si own1
depende de thirdParty1
(que se ha hello
definido como hello world
) está llegando hi there
(desde thirdParty2
) en el controlador. Lo mismo es para el par de los otros módulos.
¿Hay alguna manera de "aislar" los módulos para que solo pueda usar cosas de las que dependo explícitamente? De lo contrario, ¿de qué sirve tener módulos si puedo llegar a algo en cualquier momento (suponiendo que el módulo de la aplicación principal lo tenga como dependencia)? Además, si tengo dos módulos con componentes llamados hello
¿cómo puedo saber cuál se va a usar?
Aquí está jsbin para ese http://jsbin.com/vapuye/3/edit?html,js,output
angular.module(''app'', [''own1'', ''own2'']);
//third-party modules
angular.module(''thirdParty1'', []).factory(''hello'', function () {
return ''hello world'';
});
angular.module(''thirdParty2'', []).factory(''hello'', function () {
return ''hi there'';
});
// "own" modules
angular.module(''own1'', [''thirdParty1'']).controller(''Own1Ctrl'', function(hello) {
this.greet = hello;
});
angular.module(''own2'', [''thirdParty2'']).controller(''Own2Ctrl'', function(hello) {
this.greet = hello;
});
Y el resultado de:
<body ng-app="app">
<div ng-controller="Own1Ctrl as own1">
Own1: {{ own1.greet }}
</div>
<div ng-controller="Own2Ctrl as own2">
Own2: {{ own2.greet }}
</div>
</body>
Es :
Own1: hi there
Own2: hi there
Puede solicitar una fábrica de un determinado módulo explícitamente (sin inyección de dependencia):
var injector = angular.injector([''thirdParty1'']);
var hello1 = injector.get(''hello'');
var injector = angular.injector([''thirdParty2'']);
var hello2 = injector.get(''hello'');
También puede usar esto para envolver las fábricas de terceros en sus propias fábricas:
angular.module(''own1'', [''thirdParty1'']).factory(''hello1'', function () {
var injector = angular.injector([''thirdParty1'']);
var hello = injector.get(''hello'');
return hello;
});
angular.module(''own2'', [''thirdParty2'']).factory(''hello2'', function () {
var injector = angular.injector([''thirdParty2'']);
var hello = injector.get(''hello'');
return hello;
});
Esto le permite usar hello1
y hello2
en todas las otras partes de su aplicación.