2016-09-02 43 views
17
@Pipe({name:'myPipe', pure: false}) 

Nie mogę zrozumieć nieczystych rur, niektóre z nich są lepsze w przypadku rur czystych.Co to jest zanieczyszczona rura w Angular?

Proszę wyjaśnić mi za pomocą prostego i podstawowego przykładu?

+0

przeczytaj [Zasadnicza różnica między czystymi i nieczystymi rurami i dlaczego to ma znaczenie] (https://medium.com/@maximus.koretskyi/the-essential-difference-between-pure-and-impure-pipes-and -Dlaczego-tamto-999818aa068), który wyjaśnia szczegóły kryjące się za różnicą i bada leżący u podstaw modelu mentalnego. –

Odpowiedz

22

Czysta rura jest wywoływana tylko wtedy, gdy kątowy wykrywa zmianę wartości lub parametry przekazywane do rury. Nieczysta rura jest wywoływana dla każdego cyklu wykrywania zmian, bez względu na to, czy wartość lub parametry ulegną zmianie.

Jest to istotne dla zmian, które nie są wykrywane przez kątowe

  • gdy mijamy tablicę lub obiekt, który dostał zawartość zmianie (ale nadal jest ta sama instancja)
  • gdy rura wstrzykuje usługę aby uzyskać dostęp do innych wartości, Angular nie rozpoznaje, czy uległy one zmianie.

Te przypadki prawdopodobnie nadal wymagają wykonania rury.

Należy mieć świadomość, że zanieczyszczone rury są podatne na nieefektywność. Na przykład, gdy tablica jest przekazywana do potoku w celu filtrowania, sortowania, ... to działanie może być wykonywane za każdym razem, gdy uruchamiane jest wykrywanie zmian (co jest dość często z domyślnym ustawieniem ChangeDetectionStrategy), chociaż tablica może nawet nie mieć zmienione. Twoja rura powinna spróbować to rozpoznać i na przykład zwrócić wyniki z pamięci podręcznej.

+1

Czy możesz wyjaśnić mi przykład? –

+0

Przykład, aby pokazać, co dokładnie? http://stackoverflow.com/a/37828164/217408 pokazuje rurkę filtrującą (ale bez buforowania). –

+0

Czysta rura oznacza, że ​​będzie wykonywana za każdym razem, gdy ktoś zmieni przekazany do niej sygnał wejściowy. Na przykład '{{2 | wykładnik: var}}; . Teraz, gdy zmieniamy wejście 'var', to wartość jest aktualizowana. Podobnie, zaktualizuj moją wartość przez nieczysty rurociąg. Ktoś??Tutaj 'wykładnik' to moja rura –

12

Oprócz poprzedniej odpowiedzi chcę dodać kolejną różnicę: liczbę instancji.

Załóżmy, że potok jest używany kilka razy w kodzie HTML. Jak:

<p> {{'Hello' | translate }}<p> 
<p> {{'World' | translate }}<p> 
  • Jeżeli rura jest czysta będzie tylko jeden przykład rury. Metoda transformacji zostanie wywołana dwukrotnie, ale w tej samej instancji.
  • Jeśli rura jest zanieczyszczona: wystąpią dwa wystąpienia rury.

(widać to poprzez generowanie losowy identyfikator w konstruktorze rury i wydrukować go w obu: constructor i transform metody)

postaci czystych potoków (lub ogólnie czystych funkcji) jest (powinien) nie ma żadnych skutków ubocznych, ten sam czysty kod może być ponownie użyty dowolną liczbę razy bez zmartwień. Wygląda na to, że czyste rury są tworzone tylko raz.

OBS: obowiązuje w moim środowisku kątowym 4.0.