2012-10-06 27 views
43

Todavía soy un debutante en Angularjs. Quiero inyectar dinámicamente una dependencia de un servicio (que creé) en mi controlador.

Pero cuando el código A de servicio con dependencias, tengo este error:

error: Desconocido proveedor: $ windowProvider < - ventana $ < - base 64

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, que no funciona (no tengo la dependencia $ routeProvider en mi módulo de configuración):

error: Desconocido proveedor: $ routeProvider de mainModule

var mainModule = angular.module('main', [], 
    function($routeProvider, $locationProvider) { 
     //Some routing code 
    } 
); 

JS Fiddles

mismo módulo con dependencias (+ controlador de servicio): http://jsfiddle.net/yrezgui/YedT2/

módulo diferente con dependencias: http://jsfiddle.net/yrezgui/YedT2/4/

módulo diferente y sin dependencias: http://jsfiddle.net/yrezgui/YedT2/5/

+0

Ambos ejemplos deberían funcionar. Si no lo hacen, el problema debe ser en otro lugar. Sería genial si pudieras proporcionar jsFiddle que pudiéramos arreglar, para que tengamos toda la aplicación, en lugar de un pequeño fragmento. –

Respuesta

59

No llame angular.injector() - esto crea un nuevo inyector. En su lugar, se inyecta la ya creada $injector en el controlador y utilizarlo:

Así que en lugar de:

var algoController = function($scope) { 
    $scope.base64 = angular.injector(['main']).get('base64'); 
}; 

Haga lo siguiente:

var algoController = function($scope, $injector) { 
    $scope.base64 = $injector.get('base64'); 
}; 

Pero la mayoría de las veces, debe inyectarse su servicio directamente, en lugar de dinámicamente, como lo siguiente:

var algoController = function($scope, base64) { 
    $scope.base64 = base64; 
}; 

Véase también AngularJS dynamically inject scope or controller

+0

Cómo obtener base64 si depende de cualquier otro servicio – sms

Cuestiones relacionadas