Angular JS - 使用控制器名称装饰服务

时间:2014-07-30 16:31:26

标签: angularjs angularjs-service

我不清楚decorator究竟如何与角度$injector一起使用,所以任何解释都是有帮助的。

考虑我的myTempService

$provide.decorator('myTempService', function($delegate) {
  $delegate.controller = // some service to get the current controller
  return $delegate;
});

myTempService注入我的控制器时,我需要myTempService.controller作为控制器的名称:

.controller('MainCtrl', function (myTempService) {
   console.log(myTempService.controller); // MainCtrl
});

1 个答案:

答案 0 :(得分:0)

当您使用.value().service().factory().provider()注册服务时,您传入的内容作为第二个参数实际上将最终作为服务提供商构造函数的一部分。

当angular的引导过程开始时,每个注册的服务提供者构造函数将用于创建服务提供者实例

在配置阶段,服务提供程序实例可以注入,您可以使用它们来更改要创建的服务实例的默认配置。

angular.module('myApp').config(function ($httpProvider) {
  // $httpProvider is a provider instance of the $http service
  $httpProvider.interceptors.push(function () {});
});

在进入运行阶段之前,每个服务提供商实例都将用于创建服务实例

然后装饰器将在此时发挥作用。在将这些服务实例用于注入各个地方之前,每个服务实例将作为$delegate参数传递到其注册的装饰器中(如果有的话)。 将使用装饰器函数的结果而不是 原始服务实例

angular.module('myApp').config(function ($provide) {
  $provide.decorator('$http', function ($delegate) {
    // monkey patching
    var originalGet = $delegate.get;
    $delegate.get = function () {
      console.log('$http.get is called');
      return originalGet.apply(this, arguments);
    };

    return $delegate;
  });
});

因此,在装饰器功能中,您可以选择:

  • 只需做一些事情并返回原始服务实例,例如打印出来用于调试目的。
  • 设置服务的初始值,由于某些原因无法在配置阶段完成。
  • Monkey修补原始服务实例并将其返回。
  • 在原始服务实例上创建并返回包装器/代理服务。
  • 在单元测试中,您可以返回模拟/间谍对象。

最后,服务实例可用于注入所有地方,例如:在应用程序的整个生命周期中运行块,控制器,指令,过滤器等。