我想在可重用的服务中移出一些重复逻辑,必须在配置阶段中可用。并且可能也可以访问$xxxProvider
依赖注入。这样的事可能吗?可以用factory / provider / service / constant做到这一点吗?
具体来说,当我使用ui-router
定义路由时,我注意到CRUD的路由都是相同的,除了资源的名称。因此,我想将这种逻辑配置为某处的CRUD路由,以使路由定义更加干燥。
答案 0 :(得分:2)
要在配置块中访问您的服务提供商,这应该可以正常工作:
app.service('myService', function (/* dependencies */) {
// service stuff..
return this;
});
app.config(function ($provide) {
$provide.decorator('myService', function ($delegate) {
// $delegate refers to 'myService'.
// You can modify its behaviour and what not in here.
return $delegate;
});
});
我不清楚你在寻找什么,但这只是工作'。
请注意,如果服务注册位于同一文件中,则需要在config
块之前。解决此问题的一种方法是将服务提取到单独的模块中,并将其作为依赖项注入主模块。像这样:
var serviceModule = angular.module('serviceModule', []);
serviceModule.service('myService', function () {});
var mainModule = angular.module('main', ['serviceModule']);
mainModule.config(function ($provide) {
$provide.decorator('myService', function ($delegate) {});
});
JsBin:http://jsbin.com/pasiquju/2/edit
我现在整理了一个粗略示例,说明如何执行以下操作:
provider
注入您自己的提供程序,将功能从一个构造函数传递到另一个构造函数。 app.config
块中的更多功能传递给您的提供程序构造函数。这应该涵盖指定的需求:
providers
JsBin:http://jsbin.com/jenumobi/2/edit
here's the documentation用于provider
速记方法,以及它们的区别。正如您可以清楚地看到的那样,provider
核心功能是可用选项最多的功能 - 但也是最难处理的功能,原因很明显。
我希望能够为您做足够的事情,并为您提供有关如何创建自己的$stateProvider
扩展程序的一些想法!我已尽力记录JsBin中的代码,以便更容易理解它们是如何结合在一起的。