angularjs – Angular JS:为什么module.config注入和控制器注入
这是我无法从挖掘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’. 现在,对于注射用法: serviceModule.config(function(myserviceProvider) { console.log('myServiceProvider:',myserviceProvider); myserviceProvider.providerMethod(); }); 但是当我们将它注入控制器时(注意无提供者名称),只会暴露$get返回值: function MyCtrl1(myservice) { console.log('MyCtrl1.myservice =',myservice,myservice.name); } MyCtrl1.$inject = ['myservice']; 控制台输出如下: 任何人都可以解释这个区别吗?原因? 利奥尔 PS:我在angular-ui new 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 }); 然后你可以在配置函数中访问它的提供者myServiceProvider … myModule.config(function(myServiceProvider) { // to stuff with your provider here }); 但是当控制器被实例化时,你应该要求服务,而不是他们的提供者,所以这不会起作用…… myModule.controller(function(myServiceProvider) { ... }); 这样会很好…… myModule.controller(function(myService) { ... }); 如果您发现自己需要在控制器中进行配置,则应该停下来并重新考虑责任的位置. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |