javascript - que - Cómo inyectar dinámicamente la dependencia en un controlador.
ng controller que es (1)
Todavía soy un debutante en Angularjs. Quiero inyectar dinámicamente una dependencia de un servicio (que creé) en mi controlador.
Pero cuando codifico un servicio con dependencias, recibí este error:
Error: Proveedor desconocido: $ windowProvider <- $ window <- base64
Este es el código del controlador.
var base64 = angular.injector([''servicesModule'']).get(''base64'');
console.log("base64", base64.encode("my text will be encoded"));
Este código funciona:
var servicesModule = angular.module(''servicesModule'', []);
servicesModule.factory(''base64'', function() {
return {
name: ''base64'',
readonly: false,
encode: function(input) {
return window.btoa(input);
},
decode: function(input) {
return window.atob(input);
}
};
});
Este código no funciona:
var extModule = angular.module(''ext'', []);
extModule.factory(''base64'', [''$window'', function($window) {
return {
name: ''base64'',
readonly: false,
encode: function(input) {
return $window.btoa(input);
},
decode: function(input) {
return $window.atob(input);
}
};
}]);
Otro problema es cuando el servicio está en el mismo módulo que el controlador. Si el módulo tiene dependencias, no funciona (tengo la dependencia de $ routeProvider en la configuración de mi módulo):
Error: Proveedor desconocido: $ routeProvider de mainModule
var mainModule = angular.module(''main'', [],
function($routeProvider, $locationProvider) {
//Some routing code
}
);
JS Fiddles
Mismo módulo con dependencias (controlador + servicio): http://jsfiddle.net/yrezgui/YedT2/
Módulo diferente con dependencias: http://jsfiddle.net/yrezgui/YedT2/4/
Módulo diferente sin dependencias: http://jsfiddle.net/yrezgui/YedT2/5/
No llame a angular.injector (): esto crea un nuevo inyector. En su lugar, inyecte el $injector
creado en su controlador y utilícelo:
Así que en lugar de:
var algoController = function($scope) {
$scope.base64 = angular.injector([''main'']).get(''base64'');
};
Hacer esto:
var algoController = function($scope, $injector) {
$scope.base64 = $injector.get(''base64'');
};
Pero la mayoría de las veces debería inyectar su servicio directamente, en lugar de hacerlo dinámicamente, así:
var algoController = function($scope, base64) {
$scope.base64 = base64;
};
Ver también AngularJS inyectar dinámicamente el alcance o el controlador