gpt4 book ai didi

angularjs - Angular JS : why the difference between module. 配置注入(inject)和 Controller 注入(inject)?

转载 作者:行者123 更新时间:2023-12-04 16:53:33 27 4
gpt4 key购买 nike

这是我通过挖掘 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'。

现在,对于注入(inject)用法:
如果我们调用 config,我们可以注入(inject)整个类并访问“外部”提供程序方法:
serviceModule.config(function(myserviceProvider) {
console.log('myServiceProvider:',myserviceProvider);
myserviceProvider.providerMethod();
});

但是当我们将它注入(inject) Controller 时(注意 Provider-less 名称),只有 $get 返回值被暴露:
function MyCtrl1(myservice) {
console.log('MyCtrl1.myservice =',myservice,myservice.name);
}
MyCtrl1.$inject = ['myservice'];

控制台输出如下:
这是我的服务
我的服务提供者:
构造函数 {providerMethod: 函数, $get: 函数}
它是我的 service.providerMethod
MyCtrl1.myservice = 对象 {name: "stam"} stam

任何人都可以解释其中的区别吗?原因?
非常感谢您的任何想法

里奥

PS:我在 angular-ui new 中看到过这种技术ui-router(优秀的项目!)。我需要访问外部提供程序类才能在 Jasmine 和其他地方进行注入(inject) - 无济于事

最佳答案

提供者负责创建实例。在您的示例中,您明确创建了一个提供程序,但事实是每个服务都有一个提供程序,即使它是为它自动创建的。 [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.



另一方面, Controller 是在配置服务之后实例化的,因此您不应该再与提供者混为一谈。一切都已经配置好了。您现在就可以购买他们的产品了。在这个阶段,注入(inject)器不能再注入(inject)提供者,只能注入(inject)它们创建的实例(服务)。

如果您注册服务 myService ...
myModule.service('myService', function() {
// this is your service constructor
});

那么你可以访问它的提供者, myServiceProvider ,在配置函数中...
myModule.config(function(myServiceProvider) {
// to stuff with your provider here
});

但是当 Controller 被实例化时,你应该请求服务,而不是他们的提供者,所以这不起作用......
myModule.controller(function(myServiceProvider) {
...
});

而这会很好......
myModule.controller(function(myService) {
...
});

如果您发现自己需要在 Controller 中进行配置,您应该停下来重新考虑职责所在。

关于angularjs - Angular JS : why the difference between module. 配置注入(inject)和 Controller 注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15663019/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com