Filtre Simple sur le tableau de RXJS Observables
Je suis en train de créer mon projet avec Angular2 et les développeurs semblent recommander RXJS Observables au lieu de Promesses.
J'ai réalisé, pour récupérer une liste d'éléments (épopées) à partir du serveur.
Mais comment puis-je filtrer les elments en utilisant par exemple un id?
Le code suivant est une extraction à partir de mon application et montre maintenant la finale de la solution de travail. Espérons que cela aide quelqu'un.
@Injectable()
export class EpicService {
private url = CONFIG.SERVER + '/app/'; //URL to web API
constructor(private http:Http) {}
private extractData(res:Response) {
let body = res.json();
return body;
}
getEpics():Observable<Epic[]> {
return this.http.get(this.url + "getEpics")
.map(this.extractData)
.catch(this.handleError);
}
getEpic(id:string): Observable<Epic> {
return this.getEpics()
.map(epics => epics.filter(epic => epic.id === id)[0]);
}
}
export class EpicComponent {
errorMessage:string;
epics:Epic[];
epic:Epic;
constructor(
private requirementService:EpicService) {
}
getEpics() {
this.requirementService.getEpics()
.subscribe(
epics => this.epics = epics,
error => this.errorMessage = <any>error);
}
//actually this should be eventually in another component
getEpic(id:string) {
this.requirementService.getEpic(id)
.subscribe(
epic => this.epic = epic,
error => this.errorMessage = <any>error);
}
}
export class Epic {
id: string;
name: string;
}
Je vous remercie d'avance pour votre aide.
- vous devriez avoir quitté la question d'origine comme c'est, de cette façon, on ne saura jamais ce "pas" à faire
Vous devez vous connecter pour publier un commentaire.
Vous aurez envie de filtrer le tableau réel et non observables enroulé autour d'elle.
Ainsi, vous aurez la carte le contenu de l'Observable (qui est un
Epic[]
) à un filtréeEpic
.Puis, ensuite, vous pouvez
subscribe
àgetEpic
et faire ce que vous voulez avec elle.Vous pouvez faire cela en utilisant la
flatMap
etfilter
méthodes deObservable
au lieu de la JS matrice méthode de filtre dansmap
. Quelque chose comme:flatMap
fournira singulier indices pour le filtrage et puis vous pouvez aller sur avec tout ce qui se passe ensuite avec les résultats.Si la Machine renvoie une erreur indiquant que vous ne pouvez pas comparer une chaîne et un certain nombre, quelle que soit votre utilisation de
==
dans le filtre, il suffit d'ajouter une+
avantepic.id
dans le filtre, par l'angle de docs:Exemple:
https://stackblitz.com/edit/angular-9ehje5?file=src%2Fapp%2Fapp.component.ts
flatMap
comme l'auteur l'a souligné.data.epics
. Et vous aussi ne peut pas filtrer le tableau comme vous l'avez écrit.// { epics: [{id: 1}, {id: 2}, {id: 3}, {id: 4}, {id: 5}] }
et pas// [{id: 1}, {id: 4}, {id: 3}, ..., {id: N}]
comme dans le Stackblitz exemple.. qui me confond, merci. Devraient ai regardé int la Stackblitz exemple, de trop 🙂réponse originale à cette question avec un correctif:
Observables
sont paresseux. Vous devez appelersubscribe
de dire à unobservable
à l'envoi de sa demande.Mise à jour Rxjs 6:
this.getEpics()
retourne observables d'un Array. Donc,filter
est une méthode de ArrayVous devez vous inscrire sur
Observable
s pour obtenir les données, depuis http appels asynchrone en JavaScript.Vous pouvez appeler cette méthode, puis comme ceci: