Angular:在 node_module 组件中覆盖 DatePipe

Posted

技术标签:

【中文标题】Angular:在 node_module 组件中覆盖 DatePipe【英文标题】:Angular: Overriding DatePipe in node_module components 【发布时间】:2022-01-12 16:07:38 【问题描述】:

问题:我的 Angular 应用程序中有一个带有组件的外部库。其中一些组件在内部使用 Angular DatePipe 以“shortDate”格式转换日期。我真的没有选择使用任何其他组件或实现自定义组件,因为客户端需要使用该特定库。但他们当然也不想要“shortDate”格式。

我尝试扩展内置的 Angular DatePipe。如下:

import  DatePipe  from '@angular/common';
import  Inject, LOCALE_ID, Pipe, PipeTransform  from '@angular/core';

@Pipe(
  name: 'date'
)
export class DateExtendedPipe extends DatePipe implements PipeTransform 

  static readonly DEFAULT_FORMAT = 'dd/MM/yyyy';
  
  constructor(@Inject(LOCALE_ID) locale: string) 
    super(locale)
  

  transform(value: Date | string | number, format?: string, timezone?: string, locale?: string): string | null;
  transform(value: null | undefined, format?: string, timezone?: string, locale?: string): null;
  transform(value: Date | string | number | null | undefined, format?: string, timezone?: string, locale?: string): string | null 
    console.log('date format');
    
    const ghibFormat = format && format !== 'shortDate' ? format : DateExtendedPipe.DEFAULT_FORMAT;
    return super.transform(value, ghibFormat, timezone, locale);
  


这适用于我当前在我的应用程序中实现的任何自定义组件。每当我使用'my_var | date' 它会触发我的扩展管道而不是 Angular 的。

对于 node_modules 组件,它仍然触发默认的 Angular DatePipe 而不是我的扩展。我认为这与构建角度架构的方式有关,并且编译器首先编译 node_modules。不完全确定。只是想看看是否有人遇到过类似的问题,以及是否有任何神奇的解决方案。谢谢!

【问题讨论】:

【参考方案1】:

您只需设置正确的提供者:

  providers: [
    provide: DatePipe,
    useClass: MyDatePipe
  ]

这将为所有需要 DatePipe 的人提供 MyDatePipe。

显然,这已被弃用,现在您只需将其添加到您的 App 模块声明中即可。见答案Override Angular default date pipe

【讨论】:

相同的行为。在我的应用程序中生成的组件中像魅力一样工作,但在来自 node_modules 库的组件中不起作用。 添加了我刚刚找到的新方法。

以上是关于Angular:在 node_module 组件中覆盖 DatePipe的主要内容,如果未能解决你的问题,请参考以下文章

Angular Cli- 在 StyleURL 中添加一个位于 node_module 目录中的 css 文件

Angular2 - 在组件中测试 ngOninit

Angular - 如何将 Javascript 导入 Angular 组件

angular2 找不到名称要求

无法确定组件角度 5 的模块

Angular2 添加 PrimeNG 组件