Une vue la liste des entrées en utilisant un * ngFor basées sur une Observable:* ngPour les itérations d'un observable. Filtrage onInput devrait être possible. Comment?
view.html
<ion-searchbar [(ngModel)]="filter" (ionInput)="filterMeds()"></ion-searchbar>
<ion-list>
<ion-item *ngFor="let medicine of getMeds$() | async">
{{medicine.name}}
</ion-item>
</ion-list>
La composante relaie juste une fonction observable par les getMeds $():
component.ts
private _refreshOnInput$: Subject<any> = new Subject();
getMeds$(){
return this.medsService.medsArray$;
}
Th Le service lui-même renvoie simplement le tableau comme un observable: Observable<Medicine[]>
La médecine est un objet simple constitué de quelques chaînes de chiffres.
Maintenant, ma question: view.html ajoute une barre de recherche. Chaque fois que les utilisateurs modifie les critères de recherche, la fonction filterMeds()
est appelée:
filterMeds(){
this._refreshOnInput$.next(true);
}
Ce qui suit un blog post (cmd-f le texte « bouton refresh » pour voir ce que je suis en train de mettre en œuvre).
Je comprends que mon * ngFor doit itérer sur un observable qui fusionne à la fois l'original this.medsService.medsArray$
et le _refreshOnInput()
après avoir appliqué un certain filtrage.
component.ts ** ** tentent
filteredMeds$: Observable<Medicine[]>
// Constructor
// An event is fired whenever the search input's updated
filteredMeds$ = this._refreshOnInput$.map(() =>
this.medsService.medsArray$
.map(meds =>
meds.filter(med =>
med.name.toLowerCase().indexOf(this.filter.toLowerCase()) > -1
)
)
);
this.meds$ = Observable.merge(this.medsService.medsArray$, filteredMeds$);
// Updating the getMeds$() method:
getMeds$(){
return this.medsService.medsArray$;
}
Je ne peux pas comprendre comment créer un flux filtré valide. La même erreur se produit lorsque je sers directement la filteredMeds $ observable * ngFor:
ERROR Error: Error trying to diff '[object Object]'. Only arrays and iterables are allowed
Salut Jaroslaw, merci pour l'entrée, mais j'ai oublié de mentionner que l'observable non filtré de base affiche correctement. Le problème vient de mon filtrage. Mais merci pour le conseil de la meilleure pratique! – Jem