如何使用 Angular Decorator 减少重复代码?

Posted

技术标签:

【中文标题】如何使用 Angular Decorator 减少重复代码?【英文标题】:How to use Angular Decorator to reduce repetitive code? 【发布时间】:2017-11-09 01:44:33 【问题描述】:

我有一个需要在 90% 的组件中初始化的 I18nService。执行此操作的过程是导入服务、导入翻译文件、实现 ngOnInit() 并调用服务init() 函数。

现在我正在尝试借助类装饰器来减少重复代码。 我目前面临的问题是在装饰器中使用我的 I18nService ,因为装饰器似乎在编译时运行。我试图解决注射器的问题并关注这篇文章:https://netbasal.com/inspiration-for-custom-decorators-in-angular-95aeb87f072c 但得到了AppModule undefined

我该如何解决这个问题?装饰器是实现这一目标的正确选择吗?

【问题讨论】:

【参考方案1】:

您可以将Injector 存储在构造函数AppModule 中,然后在修补的ngOnInit 方法中使用它来获取在您的应用中注册的一些服务

app.module.ts

@NgModule(
  ...
  providers: [AnalyticsService],
)
export class AppModule 
  constructor(private injector: Injector) 
    AppModule.injector = injector;
  

  static injector: Injector;

page-track.decorator.ts

import  AnalyticsService, AppModule  from './app.module';

export function PageTrack(): ClassDecorator 
  return function ( constructor : any ) 
    const ngOnInit = constructor.prototype.ngOnInit;
    constructor.prototype.ngOnInit = function ( ...args ) 
      let service = AppModule.injector.get(AnalyticsService);
      service.visit();
      ngOnInit && ngOnInit.apply(this, args);
    ;
  

app.component.ts

@Component(
  selector: 'my-app',
  templateUrl: `./app.component.html`
)
@PageTrack()
export class AppComponent 

Plunker Example

【讨论】:

以上是关于如何使用 Angular Decorator 减少重复代码?的主要内容,如果未能解决你的问题,请参考以下文章

转:angular的decorator方法

Angular 4 Decorator 无法访问类范围

如何减少/消除 Angular 应用程序中的内存泄漏

Python decorator @property

如何在 javascript (ionic | Angular | NodeJS | MongoDB) 中将包含对象的数组展平和减少为逗号分隔的字符串

Python中的@property和decorator