각도-서비스 및 구성 요소에 파이프 사용


331

AngularJS에서는 다음과 유사한 구문을 사용하여 서비스 및 컨트롤러 내부에서 필터 (파이프)를 사용할 수 있습니다.

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

Angular에서 이와 같은 서비스 / 구성 요소에 파이프를 사용할 수 있습니까?


1
Angular 8의 경우 내장 및 사용자 정의 파이프에서이 자습서를 확인하십시오. freakyjolly.com/angular-8-pipes-all-type-of-pipes-with-examples
Code Spy

답변:


660

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 호환

슬프게도 오류가 발생하여 앱이 중단됩니다. Github 트래커에는 문제가 있지만 현재는 좋은 폴리 필이없는 것 같습니다.
cexbrayat

4
생성자에서 종속성 주입을 사용하는 사용자 지정 파이프에는 작동하지 않는 것 같습니다. 아니면 내가 착각합니까?
머레이 스미스

1
@JayChase는 "angular2 / common"에 있습니다.
valter.santos.matos

5
@JayChase 가져 오기 및 컴포넌트 제공자 섹션에 추가 :```import {DatePipe} from '@ angular / common'; @Component ({... provider : [..., DatePipe]})```
alx lark

74

이 답변은 이제 구식입니다

이 접근법 대신 다른 답변의 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');

2
자바 스크립트 Date생성자를 사용할 때 월은 0기준입니다. 그래서 01월하고 12월이다. 누락 수정y
SnareChops

24
다른 것이 도움이되는 경우 날짜 파이프를 'angular2 / common'에서 가져옵니다.
POSIX 호환

1
코드 스 니펫이 컴파일되지 않습니다 .... error TS2345: Argument of type 'string[]' is not assignable to parameter of type 'string'. 라인var formatted = new DatePipe().transform(raw, ['yyyy-MM-dd']);
Paul Gorbas

10
이제 Angular v2.0.0을 출시했으며이 파이프를 주입 할 수 있습니다. 먼저 NgModule :에 추가 @NgModule({ providers:[DatePipe] })한 다음 수업에서 가져 오기 및 주입 constructor( private datePipe: DatePipe ){}
ktretyak

2
한편 Angular2 DatePipe는 Locale_ID를 생성자 인수로 예상합니다. 따라서 직접 사용하려고하면 Locale_ID 수정을 제공해야하므로 더 이상 Locale_ID 앱을 사용하지 않습니다. 그래서 나는 그렇게하지 않는 것이 좋습니다.
E. Hein

17

예, 간단한 맞춤형 파이프를 사용하면 가능합니다. 사용자 지정 파이프를 사용하면 나중에 날짜 형식을 업데이트해야하는 경우 단일 파일로 이동하여 업데이트 할 수 있다는 이점이 있습니다.

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'

커스텀 파이프 예제 및 추가 정보


1
컴포넌트 또는 서비스에서 파이프를 사용하는 방법에 대한 질문에는 대답하지 않습니다.
POSIX 호환

2
파이프를 만드는 방법에 대한 정보를 포함하지 않도록 답변을 업데이트 할 경우 다운 보트를 제거하겠습니다. 질문은 그것들을 만드는 방법과 아무 관련이 없습니다.
POSIX 호환

2
@POSIX 호환 내 대답에서 언급했듯이 사용자 지정 파이프를 사용하여 매우 쉽게 재사용하고 업데이트 할 수 있습니다. 다른 사람에게 도움이 될 수 있습니다. 투표는 부차적입니다.
Prashobh

1
나는 여전히이 특정 질문에 먼저 답하는 부분을 갖는 것이 합리적이라고 생각하지만 그것은 공정한 포인트입니다. 다운 투표를 제거합니다. 답변과 답변 주셔서 감사합니다.
POSIX 호환

1
왜 "en-US"를 하드 코딩 했습니까? 어떻게 든 주사하지 않아야합니까?
Gherman

15

다른 답변은 각도 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')
    }
}

여기서 핵심은 Inject 및 각도의 코어에서 LOCALE_ID를 가져온 다음 DatePipe에 제공하여 올바르게 인스턴스화하는 것입니다.

DatePipe를 공급자로 설정

앱 모듈에서 다음과 같이 제공자 배열에 DatePipe를 추가 할 수도 있습니다.

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

@NgModule({
    providers: [
        DatePipe
    ]
})

이제 cexbrayat의 답변과 같이 필요할 때 생성자에 주입 할 수 있습니다.

요약:

어느 솔루션이든 효과가 있었지만 어느 각도가 가장 "올바르다"고 생각할지 모르겠지만, 각도는 공급자로서 날짜 파이프를 제공하지 않았기 때문에 수동으로 인스턴스화하기로 선택했습니다.


3
당신은 또한 구성 요소 제공 업체로 만들 수 있습니다
Jimmy Kane

감사합니다. 귀하의 답변이 가장 철저합니다. 파이프를 새로 인스턴스화하거나 종속성을 직접 주입하고 공급자에 추가하고 아무것도 찾을 수 없다는 차이점에 대한 리소스를 찾고 있습니다. 나는 두 번째 접근 방식을 선호합니다 new. 파이프 를 올릴 때 원인 은 여전히 ​​로케일을 DI해야합니다. 전체 @Inject(LOCALE_ID) private locale: string구문이 번거 롭습니다.
codeepic

@ codeepic 아마 큰 차이가 있다고 말하지 않을 것입니다. 당신이 저에게 묻는다면, 앵귤러는 아마도 그것을 제공자로 만들었을 것입니다.
csga5000

9

파이프에 종속성을 주입하기 때문에 'new myPipe ()'를 원하지 않으면 공급자와 같은 구성 요소를 주입하고 새로운없이 사용할 수 있습니다.

예:

// 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);
  }
}

9

컴포넌트에서 사용자 정의 파이프를 사용하려는 경우 추가 할 수 있습니다.

@Injectable({
  providedIn: 'root'
})

사용자 정의 파이프에 주석. 그런 다음 서비스로 사용할 수 있습니다


그것은 가지고 좋은 providedIn: 'root'우리 관내 또는 파이프가 사용되는 지역에 설치된 모듈?
Daniel.V

1
파이프를 사용하는 위치에 따라 다릅니다. 하나의 모듈에서만 파이프를 사용하는 경우 두 번째 옵션을 선택할 수 있습니다. 앱에서 여러 모듈에서 파이프를 사용하는 경우, 당신은 providedIn 첫 번째 옵션을 선택해야합니다 : '루트'
SRT


5

formatDate ()를 사용하여 서비스 또는 구성 요소 ts의 날짜를 형식화 할 수 있습니다. 통사론:-

formatDate(value: string | number | Date, format: string, locale: string, timezone?: string): string

다음과 같이 일반적인 모듈에서 formatDate ()를 가져옵니다.

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

이 클래스에서 사용하십시오.

formatDate(new Date(), 'MMMM dd yyyy', 'en');

이와 같이 angular에서 제공하는 사전 정의 된 형식 옵션을 사용할 수도 있습니다.

formatDate(new Date(), 'shortDate', 'en');

여기에서 미리 정의 된 다른 모든 형식 옵션을 볼 수 있습니다.

https://angular.io/api/common/DatePipe

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.