Rury kątowe w Serwisach i podzespołach

W AngularJS, jestem w stanie używać filtrów (rur) wewnątrz usług i kontrolerów używając składni podobnej do tej:

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

Czy możliwe jest stosowanie rur w serwisach/komponentach takich jak ten w Angular?

 207
Author: Lazar Ljubenović, 2016-02-02

6 answers

Jak zwykle w Angular, można polegać na iniekcji zależności:

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

class MyService {

  constructor(private datePipe: DatePipe) {}

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

Dodaj DatePipe do listy dostawców w module; jeśli zapomnisz tego zrobić, otrzymasz błąd no provider for DatePipe:

providers: [DatePipe,...]

Aktualizacja Angular 6 : Angular 6 oferuje teraz prawie wszystkie funkcje formatowania używane przez rury publicznie. Na przykład, możesz teraz użyć formatDate funkcjonować bezpośrednio.

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

class MyService {

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

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

Przed Angular 5: ostrzegam jednak, że DatePipe opierał się na API Intl do wersji 5, która nie jest obsługiwana przez wszystkie przeglądarki (sprawdź tabelę zgodności ).

Jeśli używasz starszych wersji kątowych, powinieneś dodać Intl polyfill do swojego projektu, aby uniknąć jakiegokolwiek problemu. Zobacz to podobne pytanie aby uzyskać bardziej szczegółową odpowiedź.

 407
Author: cexbrayat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-12 16:58:01

Ta odpowiedź jest już nieaktualna

Zaleca się stosowanie podejścia DI

Powinieneś być w stanie używać klasy bezpośrednio

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

Na przykład

var raw = new Date(2015, 1, 12);
var formatted = new DatePipe().transform(raw, 'yyyy-MM-dd');
expect(formatted).toEqual('2015-02-12');
 63
Author: SnareChops,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-17 19:05:24

Tak jest to możliwe przy użyciu prostej rury niestandardowej. Zaletą korzystania z niestandardowego potoku jest to, że jeśli będziemy musieli zaktualizować format daty w przyszłości, przejdź i zaktualizuj pojedynczy plik.

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

Zawsze możesz używać tej rury w dowolnym miejscu, komponencie, usługach itp

Na przykład

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

Nie zapomnij zaimportować zależności.

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

Niestandardowe przykłady rur i więcej informacji

 10
Author: Prashobh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-07 10:04:14

Inne odpowiedzi nie działają w angular 5?

Dostałem błąd, ponieważ DatePipe nie jest dostawcą, więc nie można go wstrzyknąć. Jednym z rozwiązań jest umieszczenie go jako dostawcy w module aplikacji, ale moim preferowanym rozwiązaniem było utworzenie go.

Utwórz instancję w razie potrzeby:

Spojrzałem na kod źródłowy DatePipe, aby zobaczyć, jak dostał locale: https://github.com/angular/angular/blob/5.2.5/packages/common/src/pipes/date_pipe.ts#L15-L174

I wanted to use it wewnątrz rury, więc mój przykład jest w innej rurze:

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

Kluczem tutaj jest importowanie Inject i LOCALE_ID z rdzenia angular, a następnie wstrzykiwanie go, abyś mógł dać go DatePipe, aby poprawnie utworzyć instancję.

Uczyń DatePipe dostawcą

W module aplikacji możesz również dodać DatePipe do tablicy dostawców w następujący sposób:

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

@NgModule({
    providers: [
        DatePipe
    ]
})

Teraz możesz go po prostu wstrzyknąć do swojego konstruktora, gdzie jest to potrzebne (jak w cexbrayat ' s odpowiedź).

Podsumowanie:

Oba rozwiązania zadziałały, Nie wiem, które z angular uznałoby za najbardziej "poprawne", ale zdecydowałem się utworzyć instancję ręcznie, ponieważ angular nie dostarczył datepipe jako samego dostawcy.

 7
Author: csga5000,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-21 21:40:06

Począwszy od Angular 6 możesz zaimportować formatDate z @angular/common narzędzia do użycia wewnątrz komponentów.

Został intruzowany w https://github.com/smdunn/angular/commit/3adeb0d96344c15201f7f1a0fae7e533a408e4ae

I może być używany jako:

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

Chociaż locale musi być dostarczone

 5
Author: Jimmy Kane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-14 11:02:51

Jeśli nie chcesz robić 'new myPipe ()', ponieważ wstrzykiwasz zależności do pipe ' a, możesz wprowadzić w komponencie takim jak provider i używać go bez new.

Przykład:

// 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);
  }
}
 4
Author: andy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-20 08:15:37