2012-10-06 12 views
43

Sono ancora un debuttante su Angularjs. Voglio iniettare dinamicamente una dipendenza di un servizio (che ho creato) nel mio controller.Come eliminare in modo dinamico la dipendenza in un controller

Ma quando I Codice un servizio con le dipendenze, ho ottenuto questo errore:

Errore: Sconosciuto fornitore: $ windowProvider < - $ finestra < - base64

Questo è il codice del controller.

var base64 = angular.injector(['servicesModule']).get('base64'); 
console.log("base64", base64.encode("my text will be encoded")); 

Questo codice funziona:

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); 
     } 

    }; 

}); 

Questo codice non funziona:

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); 
     } 

    }; 

}]); 

Un altro problema è quando il servizio è nello stesso modulo come controller. Se il modulo ha le dipendenze, io non funziona (ho dipendenza $ routeProvider nel mio modulo di configurazione):

Errore: Sconosciuto fornitore: $ routeProvider da mainModule

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

JS Fiddles

stesso modulo con dipendenze (controller + servizio): http://jsfiddle.net/yrezgui/YedT2/

modulo diverso con dipendenze: http://jsfiddle.net/yrezgui/YedT2/4/

modulo diverso, senza dipendenze: http://jsfiddle.net/yrezgui/YedT2/5/

+0

entrambi questi esempi dovrebbero funzionare. Se non lo fanno, il problema deve essere altrove. Sarebbe fantastico se tu potessi fornire jsFiddle che potremmo risolvere, in modo da avere l'intera app, piuttosto che un piccolo frammento di codice. –

risposta

59

Non chiamare angular.injector() - questo crea un nuovo iniettore. Invece, iniettare il già creato $injector nel controller e usarlo:

Così, invece di:

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

Fate questo:

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

Ma la maggior parte del tempo si deve iniettare il vostro servizio direttamente, piuttosto che dinamicamente, in questo modo:

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

Vedere anche AngularJS dynamically inject scope or controller

+0

Come ottenere base64 se dipende da qualsiasi altro servizio – sms

Problemi correlati