javascript - 如何在 Controller 中 $inject 动态依赖

标签 javascript angularjs dependency-injection

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

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

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

这是 Controller 的代码。

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

    };

}]);

另一个问题是当服务和 Controller 在同一个模块时。 如果模块有依赖项,我将无法工作(我的模块配置中有 $routeProvider 依赖项):

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

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

JS fiddle

具有依赖项的同一模块( Controller +服务):http://jsfiddle.net/yrezgui/YedT2/

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

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

最佳答案

不要调用 angular.injector() —— 这会创建一个新的注入(inject)器。相反,将已经创建的 $injector 注入(inject)到您的 Controller 中并使用它:

所以代替:

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

这样做:

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

但大多数时候你应该直接注入(inject)你的服务,而不是像这样动态注入(inject):

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

另见 AngularJS dynamically inject scope or controller

关于javascript - 如何在 Controller 中 $inject 动态依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12758157/

相关文章:

javascript - 使用 fetch 和 await 时如何将用户重定向到不同的页面?

javascript - 我如何知道一组异步函数是否已完成执行?

javascript - AngularJS 不会在 img 选项卡内渲染范围

c# - ASP.NET Core 中 Func<T> 类型的依赖注入(inject)

java - 绑定(bind)到 Guice 提供程序实例时显式添加绑定(bind)器依赖项

php - 用于表单验证的 jQuery post 函数只允许 alert() 显示返回的数据

javascript - 未捕获的类型错误 : Cannot read property 'ChartWrapper' of undefined

javascript - 如何在 pagingtoolbar Ext js 4.2 中获取检查的行数?

javascript - 将数据对象传递给 ng-repeat 中的指令

asp.net-mvc - HtmlHelper 扩展方法中的依赖注入(inject)?