Açısal - Servislerde ve bileşenlerde borular kullanın


Yanıtlar:


660

Angular'da her zamanki gibi bağımlılık enjeksiyonuna güvenebilirsiniz:

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

class MyService {

  constructor(private datePipe: DatePipe) {}

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

Ekle DatePipesizin modülünde sağlayıcılarınızın listesine; bunu yapmayı unutursanız bir hata alırsınız no provider for DatePipe:

providers: [DatePipe,...]

Açısal 6'yı Güncelle : Açısal 6 artık borular tarafından herkese açık olarak kullanılan hemen hemen tüm biçimlendirme işlevlerini sunuyor. Örneğin, artık formatDateişlevi doğrudan kullanabilirsiniz .

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

class MyService {

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

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

Açısal 5'ten önce : DatePipeTüm tarayıcılar tarafından desteklenmeyen sürüm 5'e kadar Intl API'sine bağlı olduğu konusunda uyarılmalıdır ( uyumluluk tablosunu kontrol edin ).

Eski Açısal sürümleri kullanıyorsanız, Intlherhangi bir sorundan kaçınmak için projenize çoklu dolguyu eklemeniz gerekir . Daha ayrıntılı bir cevap için bu ilgili soruya bakın .


Intl'yi desteklemeyen bir tarayıcıda DatePipe kullanmanın sonucu ne olur? Destek eksikliğine karşı koymak için herhangi bir shim / ployfill var mı?
POSIX uyumlu

Ne yazık ki bir hata atıp uygulamanızı şu anda kıracak. Github izleyicide açılan sorunlar var, ancak şu anda iyi bir
çoklu dolgu

4
Bu, yapıcılarında bağımlılık enjeksiyonu kullanan özel borular için işe yaramaz gibi görünüyor. Yoksa yanılıyor muyum?
Murray Smith

1
@JayChase "açısal2 / ortak" dır.
valter.santos.matos

5
@JayChase içe aktarma ve bileşen sağlayıcı bölümlerine ekleme: `` '@ angular / common' dan {DatePipe} içe aktarma; @Component ({... sağlayıcıları: [..., DatePipe]}) ``
alx lark

74

Bu cevap şimdi modası geçmiş

bu yaklaşım yerine diğer cevaplardan DI yaklaşımı kullanmanızı tavsiye ederim

Orijinal cevap:

Sınıfı doğrudan kullanabilmelisiniz

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

Örneğin

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

2
Javascript Dateyapıcısını kullanırken aylar 0esas alınır. Yani 0Ocak ve 1Şubat ayıdır. Eksik düzeltildiy
SnareChops

24
Başka herhangi bir yardımcı olursa, tarih borusu 'açısal2 / ortak' ithal.
POSIX uyumlu

1
Kod pasajı error TS2345: Argument of type 'string[]' is not assignable to parameter of type 'string'.var formatted = new DatePipe().transform(raw, ['yyyy-MM-dd']);
derlenmiyor

10
Şimdi Angular v2.0.0 yayınlandı ve bu boruyu enjekte edebilirsiniz. Önce NgModule'a ekleyin:, @NgModule({ providers:[DatePipe] })sonra sınıfınızda, içe aktarın ve enjekte edin constructor( private datePipe: DatePipe ){}
ktretyak

2
Bu arada Angular2 DatePipe, Locale_ID öğesini yapıcı argümanı olarak bekliyor. Bu yüzden doğrudan kullanmaya çalışırsanız, bir Locale_ID düzeltmesi sağlamanız gerekir ve bunun için Locale_ID uygulamalarını artık almaz. Bu yüzden bu şekilde gitmenizi tavsiye ETMEM.
E. Hein

17

Evet, basit bir özel boru kullanarak mümkündür. Özel kanal kullanmanın avantajı, gelecekte tarih biçimini güncellememiz gerektiğinde, gidip tek bir dosyayı güncelleyebilmemizdir.

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 }}

Bu boruyu her zaman her yerde, bileşen, servis vb.

Örneğin

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

Bağımlılıkları içe aktarmayı unutmayın.

import { Component } from '@angular/core';
import {dateFormatPipe} from './pipes'

Özel Boru örnekleri ve daha fazla bilgi


1
Bu, bir bileşen veya hizmette boruların nasıl kullanılacağı sorusuna cevap vermez.
POSIX uyumlu

2
Cevabınızı nasıl oluşturacağınızla ilgili bilgileri içermeyecek şekilde güncellerseniz, aşağı oyumu kaldıracağım. Sorunun onları nasıl oluşturacağınızla ilgisi yok.
POSIX uyumlu

2
@ POSIX uyumlu Cevabımda belirttiğim gibi, özel boru kullanarak çok kolay bir şekilde yeniden kullanılabilir ve güncellenebilir. Başka birine tam olarak yardımcı olabilir. Oylar ikincil.
Prashobh

1
En azından bu özel soruyu ilk önce cevaplayan kısma sahip olmanın mantıklı olduğunu düşünmeme rağmen bu adil bir nokta. Oy kaldırılıyor. Cevabınız için teşekkür ederiz.
POSIX uyumlu

1
Neden "tr-tr" kodunu yazdınız? Bir şekilde enjekte etmemeli misin?
Gherman

15

Diğer cevaplar açısal 5'te çalışmıyor mu?

DatePipe bir sağlayıcı olmadığı için bir hata aldım, bu yüzden enjekte edilemez. Bir çözüm, onu uygulama modülünüze bir sağlayıcı olarak koymaktır, ancak tercih ettiğim çözüm bunu başlatmaktı.

Gerektiğinde örnekleyin:

Yerel ayarı nasıl aldığını görmek için DatePipe'ın kaynak koduna baktım: https://github.com/angular/angular/blob/5.2.5/packages/common/src/pipes/date_pipe.ts#L15-L174

Bir boru içinde kullanmak istedim, bu yüzden örneğim başka bir boru içinde:

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')
    }
}

Buradaki anahtar, Inject ve LOCALE_ID değerlerini açısal çekirdekten içe aktarmak ve ardından bunu düzgün bir şekilde başlatmak için DatePipe'a verebilmeniz için enjekte etmektir.

DatePipe'ı sağlayıcı yap

Uygulama modülünüzde, sağlayıcı dizinize şu şekilde DatePipe ekleyebilirsiniz:

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

@NgModule({
    providers: [
        DatePipe
    ]
})

Şimdi sadece gerektiğinde kurucunuza enjekte edebilirsiniz (cexbrayat'ın cevabı gibi).

Özet:

Her iki çözüm de işe yaradı, hangisinin bir açısal en "doğru" olarak değerlendireceğini bilmiyorum ama açısal bir sağlayıcı olarak datepipe sağlamadığı için manuel olarak başlatmayı seçtim.


3
Ayrıca, bileşen sağlayıcı başına da yapabilirsiniz
Jimmy Kane

Teşekkürler, cevabınız en kapsamlı. Boruyu yeni enjekte etmek veya doğrudan enjekte etmek ve sağlayıcılara eklemek ve hiçbir şey bulamamak arasında bir fark bulmak için bazı kaynaklar arıyorum. 2. yaklaşımı tercih ederim, çünkü newboruyu yukarı kaldırdığınızda, hala yerel ayarı DI yapmak zorundasınız. Tüm @Inject(LOCALE_ID) private locale: stringsözdizimini hantal buluyorum .
codeepic

@codeepic Muhtemelen gerçekten büyük bir fark olduğunu söylemezdim. Bana sorarsanız, açısal muhtemelen bir sağlayıcı yapmalıydı.
csga5000

9

Boruya bağımlılıklar enjekte ettiğiniz için 'yeni myPipe ()' yapmak istemiyorsanız, sağlayıcı gibi bileşeni enjekte edebilir ve yeni olmadan kullanabilirsiniz.

Misal:

// 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

Özel borunuzu bileşenlerinizde kullanmak istiyorsanız,

@Injectable({
  providedIn: 'root'
})

özel borunuza ek açıklama. Sonra bir hizmet olarak kullanabilirsiniz


borumuzun providedIn: 'root'içinde olması veya borunun kullanıldığı yerel bir modülde sağlanması iyi midir?
Daniel.V

1
Boruyu nerede kullandığınıza bağlıdır. Boruyu yalnızca bir modülde kullanırsanız, ikinci seçeneği belirleyebilirsiniz. Ancak boruyu uygulamanızdaki çeşitli modüllerde kullanırsanız, sağlanan ilk seçeneği seçmelisiniz: 'root'
srt


5

Hizmetlerde veya bileşenlerde tarihi biçimlendirmek için formatDate () öğesini kullanabilirsiniz. sözdizimi:-

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

formatDate () yöntemini bunun gibi ortak modüllerden içe aktarır,

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

ve sadece sınıfta böyle kullanın,

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

Bunun gibi açısal tarafından sağlanan önceden tanımlanmış format seçeneklerini de kullanabilirsiniz,

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

Önceden tanımlanmış diğer tüm format seçeneklerini burada görebilirsiniz,

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.