配置阶段可用的角度服务

时间:2014-07-25 11:26:39

标签: angularjs angularjs-service angular-routing

我想在可重用的服务中移出一些重复逻辑,必须在配置阶段中可用。并且可能也可以访问$xxxProvider依赖注入。这样的事可能吗?可以用factory / provider / service / constant做到这一点吗?

具体来说,当我使用ui-router定义路由时,我注意到CRUD的路由都是相同的,除了资源的名称。因此,我想将这种逻辑配置为某处的CRUD路由,以使路由定义更加干燥。

1 个答案:

答案 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

修改

我现在整理了一个粗略示例,说明如何执行以下操作:

  1. 注册您自己的自定义提供程序构造函数,它返回一个对象。
  2. 将另一个provider注入您自己的提供程序,将功能从一个构造函数传递到另一个构造函数。
  3. 注册一个辅助服务,该服务会被注入提供者构造函数。
  4. app.config块中的更多功能传递给您的提供程序构造函数。
  5. 将构造函数返回的实例注入控制器。
  6. 使用args从构造函数返回的实例输出结束数据。
  7. 这应该涵盖指定的需求:

    • providers
    • 容易进入DI
    • 从服务中倾向于DI。
    • 在配置阶段可用。

    JsBin:http://jsbin.com/jenumobi/2/edit

    here's the documentation用于provider速记方法,以及它们的区别。正如您可以清楚地看到的那样,provider核心功能是可用选项最多的功能 - 但也是最难处理的功能,原因很明显。

    我希望能够为您做足够的事情,并为您提供有关如何创建自己的$stateProvider扩展程序的一些想法!我已尽力记录JsBin中的代码,以便更容易理解它们是如何结合在一起的。