44

我仍然是 Angularjs 的新手。我想在我的控制器中动态注入服务(我创建的)的依赖项。

但是,当我编写具有依赖项的服务时,我得到了这个错误:

错误:未知提供程序:$windowProvider <- $window <- 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 依赖项):

错误:未知提供者:来自 mainModule 的 $routeProvider

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/

4

1 回答 1

62

不要调用 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 动态注入范围或控制器

于 2013-02-07T04:27:14.497 回答