如何在控制器中动态注入依赖

11 浏览
0 Comments

如何在控制器中动态注入依赖

我在AngularJS上还是一个新手。

我想在我的控制器中动态注入一个我创建的服务的依赖项。

但是当我编写一个带有依赖项的服务时,我得到了以下错误:

错误:未知的提供者:$windowProvider <- $window <- base64

这是控制器的代码。

var base64 = angular.injector(['servicesModule']).get('base64');
console.log("base64", base64.encode("将被编码的文本"));

这段代码可以正常工作:

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) {
        //一些路由代码
    }
);

JS Fiddles

具有依赖项的相同模块(控制器+服务):http://jsfiddle.net/yrezgui/YedT2/

具有依赖项的不同模块:http://jsfiddle.net/yrezgui/YedT2/4/

没有依赖项的不同模块:http://jsfiddle.net/yrezgui/YedT2/5/

0