当前位置: 首页 > 面试题库 >

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

龚浩宕
2023-03-14
问题内容

我仍然是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/

没有依赖性的不同模块:html" target="_blank">http :
//jsfiddle.net/yrezgui/YedT2/5/


问题答案:

不要调用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;
};


 类似资料:
  • 问题内容: 运行期间是否可以注入示波器或控制器?或任何其他建议将服务动态注入控制器? 提前致谢 问题答案: 可以使用$ injector 将服务动态(按名称)注入到控制器中。能够通过控制器参数注入服务只是Angular提供的一种便利。在后台,Angular使用$ injector来检索对象实例。但是我们也可以自己使用$ injector。 小提琴。

  • 谢谢你。 更新:我找到了另一个解决方案,并在另一个帖子中发布了答案:https://stackoverflow.com/a/52021965/2580829

  • 问题内容: 以下angular.ui模态示例显示了调用a ,该调用后来被创建为函数: 我有2个问题/问题: 文档建议以其他方式(由于缩小问题)创建控制器,例如: 但是,如果我像这样创建控制器,如何将其注入modalInstance? 我在这里调用的控制器不是Modal Instance控制器,而是我的global ,这是问题吗?我应该以某种方式继承loginCtrl还是从ModalInstance

  • 有没有可能使控制器依赖于他们的服务,而不是通过使用服务容器,而是通过纯粹的构造函数依赖注入? 我希望以这种方式编写控制器: 不幸的是,正如我所看到的,Symfony ControllerResolver不通过ServiceContainer而是通过简单的调用创建新的控制器实例。

  • 我跟随播放2.6的Scala留档和创建非阻塞操作的示例代码,并遇到一些运行时问题。我已经使用Scala模板创建了一个新的Play应用程序()。 播放留档建议应该在新的控制器中工作的代码是(这段代码逐字取自播放留档页面,从我这里有一些额外的导入): 然后,根据使用其他线程池的文档,我定义了

  • 像这样的事情让我头疼,这太疯狂了。但事实是: 对于非控制器类,如何使用net core的内置依赖项注入?请提供一个包含实例化的示例。 谢谢