Essayer de trier un tableau de données Observable.subscribe () retournées ... nouveau dans Angular 7. Je ne sais pas comment utiliser les méthodes RXJS ici, où je dois importer quoi, et comment trier le tableau de type Event.
Event.ts
import {Component, OnInit} from '@angular/core'; import {EventsService} from '../../services/events.service'; @Component({ selector: 'app-buyer-events-list', templateUrl: './buyer-events-list.component.html', styleUrls: ['./buyer-events-list.component.scss'] }) export class BuyerEventsListComponent implements OnInit { constructor(private eventsService: EventsService) { } events; ngOnInit() { this.eventsService.getEvents().subscribe(events => this.events = events); // OR DO I ADD A PIPE OR MAP HERE AND HOW DO I DO IT? } }
EventResultObj.ts
import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Event } from '../models/Event'; import {Observable} from 'rxjs'; @Injectable({ providedIn: 'root' }) export class EventsService { eventsUrl = 'http://localhost:4200/assets/tempData/events.json'; constructor( private http: HttpClient) { } getEvents(): Observable<EventResultObj> { return this.http.get<EventResultObj>(this.eventsUrl).pipe( /// CANNOT FIGURE OUT HOW TO GET A SORT FUNCTION TO WORK HERE /// WITH THE OBSERVABLE ) } }
EventsService.ts:
import {Event} from './Event'; export interface EventResultObj { count: number; next?: any; previous?: any; results: Event[]; }
EventsList.ts
import {Venue} from './Venue'; export class Event { id: number; url: string; date: string; venue_id: number; venue: Venue; }
4 Réponses :
Vous devrez le trier dans votre service et vous abonner au composant, ainsi votre service aura quelque chose comme,
ngOnInit() { this.eventsService.getEvents().subscribe(events => this.events = events); }
puis,
getEvents(): Observable<Event[]> { return this.http.get<Event[]>(this.eventsUrl).pipe( map(events => events.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime())) ) ; }
Battez-moi, gentil!
Je me sens stupide mais je n'arrive pas à faire fonctionner ça. EventResultsObj ajouté à la question d'origine, c'est peut-être le problème car j'obtiens toujours l'erreur "La propriété 'sort' n'existe pas sur le type 'EventsResultObj'". Je suppose que c'est parce que j'essaie de trier quelque chose qui n'est pas un tableau, mais je suis perdu ici. Aidez-moi! Merci.
J'ajouterais une carte
pour trier les événements directement dans la fonction getEvents
de votre service. De cette façon, chaque classe utilisant le service obtiendra un observable de vos événements déjà triés:
import { map } from 'rxjs/operators'; getEvents(): Observable<Event[]> { return this.http.get<Event[]>(this.eventsUrl).pipe( map(events => events.sort((a: Event, b: Event) => (new Date(a.date)).getTime() - (new Date(b.date)).getTime() )) ); }
En service, vous utilisez un tube et une carte!
this.eventsService.getEvents() .subscribe(events => { console.log(events); // Example }, err => { throw err; });
}
Dans votre composant, utilisez subscribe!
public getEvents(): Observable<any> { return this.http.get(this.eventsUrl).pipe(map(response => response));
p>
Voici ma solution. J'utiliserais l'opérateur tap.
const sortById = function(data) { data.sort((a,b) => data.id - data.id); }; getEvents(): Observable<Event[]> { return this.http.get<Event[]>(this.eventsUrl) .pipe(tap(sortById)) }