什么是“装潢师”? 他们是如何使用的?

我很好奇 AngularJS 到底是什么样的装潢师。除了在 AngularJS 文档中的简介和在 Youtube 视频中的简短提及(尽管很有趣)之外,网上没有太多关于装潢师的信息。

就像 Angular 的人说的,一个装潢师是:

装饰服务,允许装饰者拦截服务 返回的实例可以是原始实例, 或委托给原始实例的新实例。

我真的不知道那个 手段是什么,我也不知道为什么要把这个逻辑从服务本身中分离出来。例如,如果我想在不同的条件下返回不同的内容,我只需要向相关函数传递不同的参数,或者使用共享该私有状态的另一个函数。

我仍然是一个 AngularJS 的菜鸟,所以我肯定这只是无知和/或坏习惯,我已经学会了。

64556 次浏览

$provide.decorator的一个很好的用例是当您需要对您的模块所依赖的第三方/上游服务进行一些小的“调整”时,同时保持服务完整(因为您不是服务的所有者/维护者)。给你是 Plunkr 的演示。

装饰者允许我们分离出横切关注点,允许服务保留单一责任原则,而不用担心“基础设施”代码。

装潢师的实际用途:

  • 缓存: 如果我们有一个服务,使潜在的昂贵的 HTTP 调用,我们可以包装在缓存装饰器的服务,检查本地存储之前,进行外部调用。
  • 调试/跟踪: 根据您的开发/生产配置设置一个开关,用调试或跟踪包装装饰您的服务。
  • 节流: 将频繁触发的调用包装在一个去弹出包装中。例如,允许我们轻松地与速率有限的服务进行交互。

在所有这些情况下,我们将服务中的代码限制在其主要职责范围内。

decorator可以拦截由 factory, service, value, provider创建的服务实例,并提供更改某些 instance(service)的选项,而这些选项在其他情况下是不可配置的/带有选项的。

它还可以提供用于测试的模拟实例,例如 $http

简单来说,我们可以说它就像一个扩展方法。为了前任。我们有一个类,它有两个方法,在运行时,我们希望添加更多的方法,然后我们使用 Decorator。

我们不能对常量使用 $Provid.decator,因为我们不能更改它们赋予只读属性的常量。

简而言之,装饰师可以描述如下:-

装饰函数拦截服务的创建,允许它 覆盖或修改服务的行为。

它通过角度使用 $provide服务并修改或替换另一个服务的实现

$provide.decorator('service to decorate',['$delegate', function($delegate) {
// $delegate - The original service instance,
//             which can be replaced, monkey patched,
//             configured, decorated or delegated to.
//             ie here what is there in the 'service to decorate'


//   This function will be invoked,
//   when the service needs to be provided
//   and should return the decorated service instance.
return $delegate;
}]);

例如:

$provide.decorator('$log', ['$delegate', function($delegate) {
// This will change implementation of log.war to log.error
$delegate.warn = $delegate.error;
return $delegate;
}]);

申请表

除了@JBland 的回答。

  • 应用程序范围的区域设置:-

    你可以在这里找到一个例子 < a href = “ https://stackoverflow. com/questions/27547680/angle-js-currency-sign-Euro-after/# answer-47881020”>

  • 按角度服务更改服务的默认行为和现有实现:-

    你可以在这里找到一个例子 < a href = “ https://docs.angularjs.org/api/auto/service/$provision # $provie.decator-example”rel = “ nofollow noReferrer”>

  • 函数在不同环境中的切换行为。