Lio*_*ior 5 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);
Run Code Online (Sandbox Code Playgroud)
您可以看到此提供程序公开$ get和某个'providerMethod'.
现在,对于注入用法:如果我们调用config,我们可以注入整个类并访问'外部'提供者方法:
serviceModule.config(function(myserviceProvider) {
console.log('myServiceProvider:',myserviceProvider);
myserviceProvider.providerMethod();
});
Run Code Online (Sandbox Code Playgroud)
但是当我们将它注入控制器时(注意无提供者名称),只会暴露$ get返回值:
function MyCtrl1(myservice) {
console.log('MyCtrl1.myservice =',myservice,myservice.name);
}
MyCtrl1.$inject = ['myservice'];
Run Code Online (Sandbox Code Playgroud)
控制台输出遵循它应该:它的我的服务myServiceProvider:构造函数{providerMethod:function,$ get:function}它的我的service.providerMethod MyCtrl1.myservice = Object {name:"stam"} stam
任何人都可以解释这个区别吗?原因?非常感谢任何想法
利奥尔
PS:我在angular-ui 新的 ui-router(优秀项目!)中看到了这种技术.我需要访问外部提供者类来在茉莉花和其他地方进行注射 - 无济于事
提供者负责创建实例.在您的示例中,您明确地创建了一个提供程序,但事实是每个服务都有一个提供程序,即使它是为它自动创建的.[module].service()而且[module].factory()只是快捷方式[module].provider().
[module].config()在提供程序注册和配置期间运行,因此您可以更改访问提供程序并对其进行操作.这是一个配置事物的地方,因此得名.
从文档(http://docs.angularjs.org/guide/module):
配置块 - 在提供程序注册和配置阶段执行.只有提供程序和常量才能注入配置块.这是为了防止在完全配置服务之前意外实例化服务.
另一方面,控制器是在配置了AFTER服务后实例化的,所以你不应该再混淆供应商了.一切都已经配置好了.你现在准备好了他们的产品.在这个阶段,注入器不能再注入提供者,只是它们创建的实例(服务).
如果您注册服务myService......
myModule.service('myService', function() {
// this is your service constructor
});
Run Code Online (Sandbox Code Playgroud)
那么你可以myServiceProvider在配置函数中访问它的提供者......
myModule.config(function(myServiceProvider) {
// to stuff with your provider here
});
Run Code Online (Sandbox Code Playgroud)
但是当控制器被实例化时,你应该要求服务,而不是他们的提供者,所以这不会起作用......
myModule.controller(function(myServiceProvider) {
...
});
Run Code Online (Sandbox Code Playgroud)
这样会很好......
myModule.controller(function(myService) {
...
});
Run Code Online (Sandbox Code Playgroud)
如果您发现自己需要在控制器中进行配置,则应该停下来并重新考虑责任的位置.
| 归档时间: |
|
| 查看次数: |
13894 次 |
| 最近记录: |