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


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.