Najwyraźniej Angular 2 użyje potoków zamiast filtrów jak w Angular1 w połączeniu z ng-for do filtrowania wyników, chociaż implementacja nadal wydaje się niejasna, bez jasnej dokumentacji.
Mianowicie to, co próbuję osiągnąć, można zobaczyć z następującej perspektywy
<div *ng-for="#item of itemsList" *ng-if="conditon(item)"></div>
Jak wdrożyć to za pomocą rur?
angular
typescript
Khaled
źródło
źródło
<div *ngFor="let item of itemsList" *ngIf="conditon(item)" ...
*ngFor
i*ngIf
na ten sam element nie są obsługiwane. Musisz zmienić jawny formularz dla jednego z nich”Odpowiedzi:
Zasadniczo piszesz potok, którego możesz użyć w
*ngFor
dyrektywie.W twoim komponencie:
W szablonie możesz przekazać ciąg, numer lub obiekt do potoku, aby użyć go do filtrowania:
W twojej fajce:
Pamiętaj, aby zarejestrować swoją rurę
app.module.ts
; nie musisz już rejestrować rur w swoim@Component
Oto Plunker, który demonstruje użycie niestandardowej rury filtrującej i wbudowanej rury plastra, aby ograniczyć wyniki.
Należy pamiętać (jak zauważyło kilku komentatorów), że istnieje powód, dla którego nie ma wbudowanych rur filtrujących w Angular.
źródło
*ngFor
parametrów w nawiasach, aby uniknąć nieporozumień i uczynić je „odpornymi na zmiany”:<li *ngFor="let item of (items | myfilter:filterargs)">
Wielu z was ma świetne podejście, ale celem jest tutaj ogólne określenie i zdefiniowanie potoku tablicowego, który jest niezwykle wielokrotnego użytku we wszystkich przypadkach w odniesieniu do * ngFor.
callback.pipe.ts (nie zapomnij dodać tego do tablicy deklaracji modułu)
Następnie w swoim komponencie musisz zaimplementować metodę o następującej sygnaturze (item: any) => boolean , w moim przypadku na przykład nazwałem ją filterUser, który filtruje wiek użytkowników większy niż 18 lat.
Twój komponent
I na koniec, twój kod HTML będzie wyglądał następująco:
Twój HTML
Jak widać, ta rura jest dość ogólna dla wszystkich elementów podobnych do tablicy, które muszą być filtrowane przez wywołanie zwrotne. W przypadku mycase okazało się, że jest bardzo przydatny w przypadku * ngF w podobnych scenariuszach.
Mam nadzieję że to pomoże!!!
kodematrix
źródło
this
niezdefiniowania, możesz napisać metodę na swoim komponencie,filterUser = (user: IUser) =>
a niefilteruser(user: IUser)
this
metody komponentu jest to, że metoda była używana jako wywołanie zwrotne i zastosowano nowythis
kontekst. Wystąpił typowy problem w obiektowym javascript, ale istnieje stare i łatwe rozwiązanie: wiążesz metody, które mają być używane jako wywołania zwrotne do oryginalnej klasy. W swoim konstruktorze dodaj następujący kod:this.myCallbackFunc = this.myCallbackFunc.bind(this);
To wszystko. Nigdy więcej nie straciszthis
.Uproszczony sposób (używany tylko na małych tablicach z powodu problemów z wydajnością. W dużych tablicach filtr należy wykonać ręcznie za pomocą kodu):
Zobacz: https://angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe
Stosowanie:
Jeśli użyjesz zmiennej jako drugiego argumentu, nie używaj cudzysłowów.
źródło
To właśnie zaimplementowałem bez użycia potoku.
component.html
component.ts
źródło
itemList
zauważalny i użyć filtru asynchronicznej:let item of itemsList | async
. Gdy nastąpi zmiana, spraw, aby obserwowalne wyemitowały nową listę. W ten sposób kod filtrujący jest uruchamiany tylko w razie potrzeby.Nie jestem pewien, kiedy to się pojawiło, ale już zrobili kromkę, która to zrobi. Jest również dobrze udokumentowany.
https://angular.io/docs/ts/latest/api/common/index/SlicePipe-pipe.html
źródło
;
. np:*ngFor="let feature of content?.keyFeatures | slice:1:5; trackBy feature?.id"
Możesz także użyć następujących:
To pokaże div, tylko jeśli twoje przedmioty spełniają warunek
Aby uzyskać więcej informacji, zobacz dokumentację kątową. Jeśli potrzebujesz również indeksu, skorzystaj z następujących opcji:
źródło
potoki w Angular2 są podobne do potoków w wierszu polecenia. Wyjście każdej poprzedniej wartości jest podawane do filtra za rurą, co ułatwia łańcuch filtrów, jak to poniżej:
źródło
item
z*ng-for="#item of itemsList"
powinna być używana do filtrowania wyników jako takich*ng-if="conditon(item)"
. Co nie działa w tym przykładzie ..item
jeśli warunek zostanie spełniony, a jeśli nie, nie będzie żadnej wartości.*ngFor
i*ngIf
na tym samym elemencie nie są obsługiwane. Musisz zmienić jawny formularz dla jednego z nich<template ngFor ...>
Dla tego wymagania wdrażam i publikuję ogólny komponent . Widzieć
https://www.npmjs.com/package/w-ng5
Aby korzystać z tych komponentów, wcześniej zainstaluj ten pakiet z npm:
Następnie zaimportuj moduł do app.module
W następnym kroku dodaj sekcję deklarowania app.module:
Przykładowe użycie
Filtrowanie prostego ciągu
Filtrowanie złożonego ciągu - pole „Wartość” na poziomie 2
Filtrowanie łańcucha złożonego - pole środkowe - „Wartość” na poziomie 1
Proste filtrowanie złożonej tablicy - pole „Nome” poziom 0
Filtrowanie w polach drzewa - pole „Waleczność” na poziomie 2 lub „Waleczność” na poziomie 1 lub „Nome” na poziomie 0
Filtrowanie nieistniejącego pola - „Waleczność” na nieistniejącym poziomie 3
Ten komponent działa z nieskończonym poziomem atrybutu ...
źródło
*ngFor="let inovice of invoices | filter:searchInvoice"
a on szuka na mojej liście, ale pokazuje pustą listę, wiesz dlaczego?Proste rozwiązanie współpracujące z Angular 6 do filtrowania ngFor jest następujące:
Rozpiętości są użyteczne, ponieważ z natury niczego nie reprezentują.
źródło
Wiem, że to stare pytanie, ale pomyślałem, że może być pomocne zaproponowanie innego rozwiązania.
odpowiednik AngularJS tego
w Angular 2+ nie możesz używać * ngFor i * ngIf na tym samym elemencie, więc będzie on następujący:
a jeśli nie możesz użyć jako kontenera wewnętrznego, użyj zamiast tego ng-container. ng-container jest przydatny, gdy chcesz warunkowo dołączyć grupę elementów (tj. używając * ngIf = „foo”) w aplikacji, ale nie chcesz owijać ich innym elementem.
źródło
Stworzyłem plunker na podstawie odpowiedzi tu i gdzie indziej.
Dodatkowo musiałem dodaj
@Input
,@ViewChild
orazElementRef
z<input>
oraz tworzenie isubscribe()
do zauważalny od niego.Filtr wyszukiwania Angular2: PLUNKR (AKTUALIZACJA: plunker już nie działa)
źródło
Najlepszym podejściem byłaby rura. ale poniżej jeden też by działał.
źródło
To jest mój kod:
Próba:
źródło
Innym podejściem, które lubię stosować w przypadku filtrów specyficznych dla aplikacji, jest użycie niestandardowej właściwości tylko do odczytu w komponencie, która pozwala na bardziej przejrzystą enkapsulację logiki filtrowania niż przy użyciu niestandardowej potoku (IMHO).
Na przykład, jeśli chcę się połączyć
albumList
i filtrowaćsearchText
:Aby powiązać w kodzie HTML, możesz następnie powiązać właściwość tylko do odczytu:
Uważam, że dla wyspecjalizowanych filtrów specyficznych dla aplikacji działa to lepiej niż potok, ponieważ utrzymuje logikę związaną z filtrem ze składnikiem.
Rury działają lepiej w przypadku filtrów wielokrotnego użytku na całym świecie.
źródło
Utworzyłem następujący potok, aby uzyskać pożądane elementy z listy.
Konwersja małych liter jest po prostu dopasowana w sposób bez rozróżniania wielkości liter. Możesz go użyć w swoim widoku w następujący sposób: -
źródło
Idealnie powinieneś stworzyć do tego rurkę angualr 2. Ale możesz zrobić tę sztuczkę.
źródło
W oparciu o zaproponowane powyżej bardzo eleganckie rozwiązanie potoku zwrotnego możliwe jest jego dalsze uogólnienie, umożliwiając przekazanie dodatkowych parametrów filtra. Następnie mamy:
callback.pipe.ts
składnik
HTML
źródło
Oto przykład, który stworzyłem jakiś czas temu i napisałem na blogu, który zawiera działającą działkę. Zapewnia rurkę filtrującą, która może filtrować dowolną listę obiektów. Zasadniczo wystarczy podać właściwość i wartość {klucz: wartość} w specyfikacji ngFor.
Nie różni się niczym od odpowiedzi @ NateMay, tyle że wyjaśniam to dość szczegółowo.
W moim przypadku odfiltrowałem nieuporządkowaną listę na niektórych tekstach (filterText) wprowadzonych przez użytkownika względem właściwości „label” obiektów w mojej tablicy za pomocą tego rodzaju narzutów:
https://long2know.com/2016/11/angular2-filter-pipes/
źródło
Pierwszym krokiem, w którym utworzysz filtr przy użyciu
@Pipe
pliku component.ts:twój.komponent.ts
I struktura danych obiektu Person:
person.ts
W twoim widoku w pliku HTML:
twój.komponent.html
źródło
To twoja tablica
To jest twoja pętla ngFor Filtruj według:
Tam używam instant filterProduct produktów, ponieważ chcę zachować moje oryginalne dane. Tutaj model _filterText służy jako pole wprowadzania danych. Gdy tylko pojawi się jakakolwiek zmiana, zadzwoni funkcja ustawiająca. W setFilterText wywoływane jest performProduct, zwróci wynik tylko tym, którzy pasują do danych wejściowych. Używam małych liter, aby nie rozróżniać wielkich i małych liter.
źródło
Po pewnym googlowaniu natknąłem się
ng2-search-filter
. W zabierze obiekt i zastosuje wyszukiwane hasło do wszystkich właściwości obiektu szukających dopasowania.źródło
Znalazłem coś dla zrobienia filtru przechodzącego przez obiekt, a potem mogę go użyć jak filtru wielofiltrowego:
Zrobiłem to rozwiązanie kosmetyczne:
filter.pipe.ts
component.ts
componentet.html
źródło