2012-10-06 10 views
43

Nadal jestem debiutantem w Angularjs. Chcę dynamicznie wstrzykiwać zależność usługi (którą stworzyłem) w moim kontrolerze.

Ale kiedy kod usługi z zależnościami, mam ten błąd:

Error: Unknown provider: $ windowProvider < - $ okno < - base64

Jest to kod regulatora.

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

Ten kod działa:

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

    }; 

}); 

Ten kod nie działa:

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

    }; 

}]); 

Innym problemem jest, gdy usługa jest w tym samym module jako kontrolera. Jeśli moduł ma zależności, że nie działa (mam $ routeProvider zależność w moim module config):

Error: Unknown provider: $ routeProvider z mainModule

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

JS Fiddles

sam moduł z zależnościami (kontroler + usługa): http://jsfiddle.net/yrezgui/YedT2/

innego modułu z zależności: http://jsfiddle.net/yrezgui/YedT2/4/

innego modułu bez zależności: http://jsfiddle.net/yrezgui/YedT2/5/

+0

oba te przykłady powinny działać. Jeśli nie, problem musi być gdzie indziej. Byłoby wspaniale, gdybyś mógł zapewnić jsFiddle, którą moglibyśmy naprawić, abyśmy mieli całą aplikację, a nie mały fragment. –

Odpowiedz

59

Nie nazywaj angular.injector() - tworzy nowy wtryskiwacz. Zamiast wstrzykiwać już utworzone $injector do kontrolera i używać go:

więc zamiast:

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

Wykonaj:

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

Ale większość czasu należy wprowadzić swoją usługę bezpośrednio, a nie dynamicznie, tak jak:

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

Zobacz także AngularJS dynamically inject scope or controller

+0

Jak uzyskać base64, jeśli zależy to od innych usług – sms

Powiązane problemy