Angular JS:模块之间为什么有区别?配置注入和控制器注入



这是我在深入研究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();
});

但是当我们把它注入到控制器中时(注意没有provider的名字),只有$get的返回值是暴露的:

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

控制台输出如下所示:这是我的服务myServiceProvider:构造函数{providerMethod: function, $get: function}它是我的service。providermethodMyCtrl1。myservice = Object {name: "stam"} stam

有谁能解释这种差异吗?的原因吗?非常感谢你的建议

Lior

PS:我在angular-ui new ui-router(优秀的项目!)中见过这种技术。我需要访问外部提供程序类做注入在茉莉花和其他地方-无济于事

提供者负责创建实例。在您的示例中,您显式地创建了一个提供者,但事实是每个服务都有一个提供者,即使它是为它自动创建的。[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) {
    ...
});

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

从Angular邮件列表中,我得到了一个很棒的帖子,它解释了服务、工厂和提供商以及它们的注入用法。我决定把它单独放在这里

具体的答案是:它是这样设计的,允许在配置时配置提供商

最新更新