Angular JS:为什么module.config注入和控制器注入之间的区别?

时间:2013-03-27 15:42:26

标签: angularjs angular-ui angularjs-service

这是我无法从挖掘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(优秀项目!)中看到了这种技术。我需要访问外部提供者类来在茉莉花和其他地方进行注射 - 无济于事

2 个答案:

答案 0 :(得分:9)

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

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

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

  

配置块 - 在提供商注册期间执行   和配置阶段。只能注入提供者和常量   到配置块。这是为了防止意外实例化   服务完全配置之前的服务。

另一方面,

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

如果您注册服务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) {
    ...
});

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

答案 1 :(得分:4)

从Angular邮件列表中,我得到了一个惊人的thread,它解释了服务与工厂与提供商及其注入使用情况。我决定把它放在自己的问题here

具体答案是:设计时允许在配置时配置提供商。