2012-10-06 50 views
43

我仍然是Angularjs的首席執行官。 我想在我的控制器中動態注入服務(我創建的)的依賴關係。如何在控制器中注入動態依賴關係

但是,當我代碼依賴關係的服務,我得到這個錯誤:

錯誤:未知提供商:$ windowProvider < - $窗口< - 的base64

這是控制器的代碼。

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

此代碼:

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

    }; 

}); 

此代碼不起作用:

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

    }; 

}]); 

的另一個問題是,當服務是同一個模塊控制器英寸 如果模塊依賴關係,我不工作(我有$ routeProvider在我的模塊配置的依賴):

錯誤:未知提供商:$ routeProvider從mainModule

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

JS小提琴與依賴

同一模塊(控制器+服務):http://jsfiddle.net/yrezgui/YedT2/

不同模塊與依賴關係:http://jsfiddle.net/yrezgui/YedT2/4/

不同的模塊,而不依賴關係:http://jsfiddle.net/yrezgui/YedT2/5/

+0

這兩個例子都應該有效。如果他們不這個問題必須在其他地方。如果您可以提供我們可以修復的jsFiddle,那將是非常好的,所以我們擁有整個應用程序,而不是一小段代碼。 –

回答

59

不要叫angular.injector() - 這將創建一個新的注射器。取而代之的是,注入已創建$injector到您的控制器,並使用它:

所以不是:

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

這樣做:

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

但大多數的時候你應該注入你的服務直接而不是動態地如此:

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

另請參見AngularJS dynamically inject scope or controller

+0

如何獲得base64,如果它依賴於任何其他服務 – sms