在AngularJS中,我可以使用类似于以下语法的服务和控制器内部使用过滤器(管道):

$filter('date')(myDate, 'yyyy-MM-dd');


是否可以在服务/组件中使用管道像这样在Angular中?

评论

对于Angular 8,请查看内置管道和自定义管道上的本教程freakyjolly.com/angular-8-pipes-all-type-of-pipes-with-examples

#1 楼

像在Angular中一样,您可以依赖依赖项注入:

 import { DatePipe } from '@angular/common';

class MyService {

  constructor(private datePipe: DatePipe) {}

  transformDate(date) {
    return this.datePipe.transform(date, 'yyyy-MM-dd');
  }
}
 


DatePipe添加到您的模块中的提供者列表;如果您忘记执行此操作,则会收到错误消息no provider for DatePipe

 providers: [DatePipe,...]
 


更新Angular 6:Angular 6现在提供了管道公开使用的几乎所有格式化功能。例如,您现在可以直接使用formatDate函数。

 import { formatDate } from '@angular/common';

class MyService {

  constructor(@Inject(LOCALE_ID) private locale: string) {}

  transformDate(date) {
    return formatDate(date, 'yyyy-MM-dd', this.locale);
  }
}
 


在Angular 5之前:请注意,尽管DatePipe在第5版之前一直依赖Intl API,但并非所有浏览器都支持它(请检查兼容性表)。

如果使用的是较旧的Angular版本,则应添加将Intl填充到您的项目中可以避免任何问题。
请参阅此相关问题以获取更详细的答案。

评论


在不支持Intl的浏览器中使用DatePipe会产生什么结果?是否可以使用任何类型的填充/填充填充物来应对缺乏支持的情况?

–符合POSIX
16年2月2日在17:35

不幸的是它将立即引发错误并中断您的应用程序。 Github追踪器上存在一些问题,但看来目前还没有好的polyfill ...

–cexbrayat
16年2月2日在17:59

这对于自定义管道似乎不起作用,自定义管道本身在其构造函数中使用依赖项注入。还是我弄错了?

–默里·史密斯(Murray Smith)
16 Mar 9 '16 at 1:29

@JayChase位于“ angular2 / common”中。

–valter.santos.matos
16年5月5日在14:25

@JayChase导入并添加组件提供程序部分:```从'@ angular / common'导入{DatePipe}; @Component({... provider:[...,DatePipe]})```

–阿拉克斯百灵
16 Dec 1'在12:39



#2 楼

现在,此答案已过时

从其他答案中推荐使用DI方法代替此方法

原始答案:

您应该可以使用直接类

 new DatePipe().transform(myDate, 'yyyy-MM-dd');
 


例如

 var raw = new Date(2015, 1, 12);
var formatted = new DatePipe().transform(raw, 'yyyy-MM-dd');
expect(formatted).toEqual('2015-02-12');
 


评论


使用javascript Date构造函数时,月数从0开始。所以0是一月,1是二月。更正了缺失的y

–SnareChops
16年2月2日,下午4:34

如果它对其他任何人有帮助,则从“ angular2 / common”导入日期管道。

–符合POSIX
16年2月2日,下午4:39

错误代码未编译。...错误TS2345:类型'string []'的参数不能分配给类型'string'的参数。在线上var formatted = new DatePipe()。transform(raw,['yyyy-MM-dd']);

– Paul Gorbas
16年7月1日在23:10



现在发布了Angular v2.0.0,您可以注入该管道。首先,添加到NgModule:@NgModule({provider:[DatePipe]}),然后在您的类中导入并注入构造函数(private datePipe:DatePipe){}

–ktretyak
16-09-28在0:27

同时Angular2 DatePipe需要Locale_ID作为构造函数参数。因此,如果您尝试直接使用它,则必须提供修复程序Locale_ID,因此它将不再使用应用程序Locale_ID。这就是为什么我不建议您那样走的原因。

– E. Hein
17年2月17日在10:35

#3 楼

是的,可以通过使用简单的自定义管道来实现。使用自定义管道的优势在于,如果将来需要更新日期格式,我们可以去更新单个文件。
 import { Pipe, PipeTransform } from '@angular/core';
import { DatePipe } from '@angular/common';

@Pipe({
    name: 'dateFormatPipe',
})
export class dateFormatPipe implements PipeTransform {
    transform(value: string) {
       var datePipe = new DatePipe("en-US");
        value = datePipe.transform(value, 'MMM-dd-yyyy');
        return value;
    }
}

{{currentDate | dateFormatPipe }}
 


您始终可以在任何地方,组件,服务等使用此管道

例如:
 export class AppComponent {
  currentDate : any;
  newDate : any;
  constructor(){
    this.currentDate = new Date().getTime();
    let dateFormatPipeFilter = new dateFormatPipe();
    this.newDate = dateFormatPipeFilter.transform(this.currentDate);
    console.log(this.newDate);
}
  
别忘了导入依赖项。
 import { Component } from '@angular/core';
import {dateFormatPipe} from './pipes'
 

自定义管道示例和更多信息

评论


这没有回答如何在组件或服务中使用管道的问题。

–符合POSIX
17年4月4日在22:00

如果您将更新答案以不包括有关如何创建管道的信息,那么我将删除我的下注。这个问题与如何创建它们无关。

–符合POSIX
17年4月13日在21:17

兼容@POSIX正如我在回答中提到的那样,它可以通过使用自定义管道非常容易地重用和更新。它可能对其他人有帮助。投票是次要的。

– prashobh
17年4月14日在15:58



这是一个公平的观点,尽管我仍然认为至少首先要回答这个特定问题是有意义的。取消不赞成投票。感谢您的回答和答复。

–符合POSIX
17-4-14在19:42



您为什么要硬编码“ en-US”?你不应该以某种方式注入吗?

–盖尔曼
17年9月25日在16:34

#4 楼

其他答案在角度5中不起作用?
由于DatePipe不是提供程序,因此无法注入,因此出现错误。一种解决方案是将其作为应用程序模块中的提供程序,但我更喜欢的解决方案是实例化它。
在需要的地方实例化它:
我查看了DatePipe的源代码以了解它如何获得语言环境:https ://github.com/angular/angular/blob/5.2.5/packages/common/src/pipes/date_pipe.ts#L15-L174
我想在管道中使用它,因此我的示例在另一个管道:
     import { Pipe, PipeTransform, Inject, LOCALE_ID } from '@angular/core';
    import { DatePipe } from '@angular/common';

    @Pipe({
        name: 'when',
    })
    export class WhenPipe implements PipeTransform {
        static today = new Date((new Date).toDateString().split(' ').slice(1).join(' '));
        datePipe: DatePipe;

        constructor(@Inject(LOCALE_ID) private locale: string) {
            this.datePipe = new DatePipe(locale);
        }
        transform(value: string | Date): string {
            if (typeof(value) === 'string')
                value = new Date(value);

            return this.datePipe.transform(value, value < WhenPipe.today ? 'MMM d': 'shortTime')
        }
    }
 

这里的关键是从Angle的核心导入Inject和LOCALE_ID,然后进行注入,以便您可以将其添加到DatePipe以便正确实例化。
将DatePipe设置为提供程序
在您的应用模块中,您还可以将DatePipe添加到您的提供程序数组中,如下所示: -override“> import { DatePipe } from '@angular/common'; @NgModule({ providers: [ DatePipe ] })
现在,您可以将其注入所需的构造函数中(如cexbrayat的回答)。
总结:知道哪个角度将最“正确”,但是我选择手动实例化它,因为angular本身没有提供日期管道作为提供者。

评论


您也可以使它成为每个组件提供者

–吉米·凯恩(Jimmy Kane)
18年4月16日在12:07

谢谢,您的回答是最详尽的。我正在寻找一些有关在使用新实例或依赖实例直接实例化管道并将其添加到提供程序而找不到任何内容之间的区别的资源。我更喜欢第二种方法,因为在更新管道时,您仍然必须DI语言环境。我发现整个@Inject(LOCALE_ID)私有语言环境:字符串语法很麻烦。

– codeepic
18/12/4在10:16



@codeepic我可能不会说真的有很大的不同。如果您问我,angular可能应该使它成为提供程序。

–csga5000
18/12/6在22:10

#5 楼

从Angular 6开始,您可以从formatDate实用程序导入@angular/common以在组件内部使用。

它被引入https://github.com/smdunn/angular/commit/3adeb0d96344c15201f7f1a0fae7e533a408e4ae

我可以用作:

import {formatDate} from '@angular/common';
formatDate(new Date(), 'd MMM yy HH:mm', 'en');


尽管必须提供语言环境

#6 楼

如果要在组件中使用自定义管道,则可以在自定义管道中添加

@Injectable({
  providedIn: 'root'
})


注释。
然后,您可以将其用作服务

评论


在管道内提供provideIn:“ root”或在使用管道的本地模块中提供它是好事吗?

–Daniel.V
19年2月5日在9:37



这取决于您在何处使用管道。如果仅在一个模块中使用管道,则可以选择第二个选项。但是,如果您在应用程序的多个模块中使用管道,则应选择提供的第一个选项:'root'

–srt
19年2月6日在10:16

#7 楼

如果因为要注入管道依赖项而不想执行“ new myPipe()”,则可以注入诸如provider之类的组件,而无需使用new。
示例:
     // In your component...

    import { Component, OnInit } from '@angular/core';
    import { myPipe} from './pipes';

    @Component({
      selector: 'my-component',
      template: '{{ data }}',
      providers: [ myPipe ]
    })
    export class MyComponent() implements OnInit {
      data = 'some data';
      constructor(private myPipe: myPipe) {}

      ngOnInit() {
        this.data = this.myPipe.transform(this.data);
      }
    }
 


#8 楼

您可以使用formatDate()格式化服务或组件ts中的日期。
语法:-
     formatDate(value: string | number | Date, format: string, locale: string, timezone?: string): string
 

import像这样的通用模块中的formatDate(),
     import { formatDate } from '@angular/common';
 

只需在此类中使用它,
     formatDate(new Date(), 'MMMM dd yyyy', 'en');
 

您还可以使用angular这样提供的预定义格式选项,
     formatDate(new Date(), 'shortDate', 'en');
 

您可以在此处查看所有其他预定义的格式选项, >