2012-10-06 51 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