2013-03-27 53 views
5

这是我从挖掘AngularJS代码中找不到的东西,也许你可以帮助解决这个谜团。Angular JS:为什么module.config注入和控制器注入之间的区别?

要显示它,我添加了一个服务于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); 

你可以看到,这个提供程序公开$获得和一定的“providerMethod”。现在

,对于注射用法: 如果我们所说的配置,我们可以注入全班并访问了“外”供应商的方法:

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

但是,当我们注入这一个控制器(注意提供商少名),只有$得到的返回值暴露:

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

控制台输出如下,它应该: 其我的服务 myServiceProvider: 构造{providerMethod:函数,$获得:功能} 它我service.providerMethod MyCtrl1.myservice = {对象名称: “斯塔姆”}斯塔姆

任何一个可以解释的区别?原因? 任何千恩万谢认为

利奥尔

PS:我已经看到了角的UI界面new路由器这种技术(精品工程!)。我需要访问外部提供者类以在茉莉花和其他地方进行注入 - 无济于事

+0

[Service vs provider vs factory?]的可能重复(http://stackoverflow.com/questions/15666048/service-vs-provider-vs-factory) – Pureferret 2015-02-24 11:56:41

回答

4

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

的具体答案是:它是如此通过设计,允许配置供应商在配置时间。

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

如果你发现自己需要做配置一个控制器,你应该停下来重新考虑责任的地方。

相关问题