加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – Angular JS:为什么module.config注入和控制器注入

发布时间:2020-12-17 06:54:10 所属栏目:安全 来源:网络整理
导读:这是我无法从挖掘AngularJS代码中找到的东西,也许你可以帮助解决这个谜. 为了展示它,我向AngularJS种子项目添加了一项服务: function MyServiceProvider() { console.log('its my service'); this.providerMethod = providerMethod; function providerMetho
这是我无法从挖掘AngularJS代码中找到的东西,也许你可以帮助解决这个谜.

为了展示它,我向AngularJS种子项目添加了一项服务:

function MyServiceProvider() {
    console.log('its my service');
    this.providerMethod = providerMethod;

    function providerMethod() {
        console.log('its my service.providerMethod');
    }

    this.$get = $get;

    function $get() {
        var innerInjectable = {
             name: 'stam'
        };
        return innerInjectable;
    }
}

var serviceModule = angular.module('myApp.services',[]).
    value('version','0.1').
    provider('myservice',MyServiceProvider);

您可以看到此提供程序公开$get和某个’providerMethod’.

现在,对于注射用法:
如果我们调用config,我们可以注入整个类并访问’外部’提供者方法:

serviceModule.config(function(myserviceProvider) {
    console.log('myServiceProvider:',myserviceProvider);
    myserviceProvider.providerMethod();
});

但是当我们将它注入控制器时(注意无提供者名称),只会暴露$get返回值:

function MyCtrl1(myservice) {
    console.log('MyCtrl1.myservice =',myservice,myservice.name);
}
MyCtrl1.$inject = ['myservice'];

控制台输出如下:
我的服务
myServiceProvider:
构造函数{providerMethod:function,$get:function}
它是我的service.providerMethod
MyCtrl1.myservice = Object {name:“stam”} stam

任何人都可以解释这个区别吗?原因?
非常感谢任何想法

利奥尔

PS:我在angular-ui new ui-router(优秀项目!)中看到了这种技术.我需要访问外部提供者类来在茉莉花和其他地方进行注射 – 无济于事

解决方法

提供者负责创建实例.在您的示例中,您明确地创建了一个提供程序,但事实是每个服务都有一个提供程序,即使它是为它自动创建的. [module] .service()和[module] .factory()只是[module] .provider()的快捷方式.

[module] .config()在提供程序注册和配置期间运行,因此您可以更改访问提供程序并对其进行操作.这是一个配置事物的地方,因此得名.

从文档(http://docs.angularjs.org/guide/module):

Configuration blocks – get executed during the provider registrations
and configuration phase. Only providers and constants can be injected
into configuration blocks. This is to prevent accidental instantiation
of services before they have been fully configured.

另一方面,控制器是在配置了AFTER服务后实例化的,所以你不应该再混淆供应商了.一切都已经配置好了.你现在准备好了他们的产品.在这个阶段,注入器不能再注入提供者,只是它们创建的实例(服务).

如果您注册服务myService …

myModule.service('myService',function() {
    // this is your service constructor
});

然后你可以在配置函数中访问它的提供者myServiceProvider …

myModule.config(function(myServiceProvider) {
    // to stuff with your provider here
});

但是当控制器被实例化时,你应该要求服务,而不是他们的提供者,所以这不会起作用……

myModule.controller(function(myServiceProvider) {
    ...
});

这样会很好……

myModule.controller(function(myService) {
    ...
});

如果您发现自己需要在控制器中进行配置,则应该停下来并重新考虑责任的位置.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读