Chcę wyświetlić listę IMessage
na ekranie i można je filtrować za pomocą Pipe
. Wiadomość jest w rzeczywistości Observable<IMessage[]>
na których chcę filtrować każdy IMessage
sprawdzając jego isPrivate
własność. Kod MessageStatusPipe
wygląda tak:
export class MessageStatusPipe {
transform(message: Observable<IMessage[]>, privateFilter: bool) {
//Here I want to return the Messages which the pass the privateFilter, but how?
}
}
Czytałem kilka pytań, które wydają się bardzo podobne, ale wydaje mi się, że nie potrafię zastosować tego rozwiązania. Poniższe rozwiązanie Luka Jacobowitz wydaje mi się dokładnie tym, czego potrzebuję. https://stackoverflow.com/questions/37991713/simple-filter-on-array-of-rxjs-observable#=
============ Zaktualizuj za pomocą odpowiedzi =============
Jak zauważył Meir, rura zwróciła wartość bool zamiast tablicy podrzędnej zawierającej elementy pasujące do filtra. Moja działająca rura wygląda teraz tak:
export class MessageStatusPipe {
transform(messages: Observable<IMessage[]>, privateFilter: bool) {
return messages.map(m => m.filter((message, i) => {
return message.isPrivate == privateFilter;
}));
}
}
Odpowiedzi:
0 dla odpowiedzi № 1Twoje działanie można (należy) podzielić na 2 części: 1. Uzyskiwanie wartości asynchronicznych 2. Filtrowanie ich
Możesz więc zmienić podpis rury na:
transform(messages: IMessage[], privateFilter: bool) { ... }
A w swoim komponencie:
<div *ngFor="let msg of messages | async | messageStatusPipe">...</div>
Jeśli z jakiegoś powodu chcesz połączyć je w jedną rurę, możesz rzucić okiem na artykuł napisałem który pokazuje jak radzić sobie z wartościami asynchronicznymi wewnątrz potoku i dostosować go do twoich potrzeb (głównie, dodaj swoje logowanie filtrowania)
============ dodana logika filtra ==============
return messages.filter(privateFilter);