W mojej klasie wątków, mam funkcję getThreads(), która zwraca mi Observable<Thread[]> ze wszystkimi moimi niciami.

Teraz chciałbym mieć kolejną wersję mojej funkcji z moimi niciami filtrowane przez wybrany motyw: Funkcja {x0}}.

Próbowałem z operatorami map i filter, ale mam następujący komunikat o błędzie Property 'theme' does not exist on type 'Thread[].

Poniżej kodu pracuję nad:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, of } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { Thread } from '../models/thread.model';
import { Theme } from '../models/theme.model';

@Injectable({
  providedIn: 'root'
})
export class ThreadService {
  private threadsUrl = 'api/threads';

constructor(private http: HttpClient) { }

getThreads(): Observable<Thread[]> {
  return this.http.get<Thread[]>(this.threadsUrl);
}

getSelectedThemeThreads(): Observable<Thread[]> {
  return this.http.get<Thread[]>(this.threadsUrl).pipe(
    map(threads => threads),
    filter(thread => thread.theme.id === theme.id)
  );
}

Z góry dziękuje za twoją pomoc.

6
Johan Rin 2 czerwiec 2018, 20:19

5 odpowiedzi

Najlepsza odpowiedź

Zrobiłem przykład tego Stackblitz / Filter -Result.

Główną ideą jest filtrowanie w map(), ponieważ filtr otrzyma tablicę obiektów.

getSelectedThemeThreads(theme: string): Observable<Flower[]> {
    return this.http.get<Flower[]>(this.threadsUrl).pipe(
      map(result =>
        result.filter(one => one.theme === theme)
      )
    )
  }
7
Sunil Garg 21 grudzień 2018, 06:09

Byłeś tam prawie. Korzystanie z tego map(threads => threads) nic poza tym, ale prawdopodobnie chciałeś tego użyć:

mergeMap(threads => threads) // will turn Observable<Thread[]> into Observable<Thread>

concatMap lub switchMap będzie również działać. Operator mergeMap spowoduje przewagę tablicy i emitują każdy element osobno, więc możesz użyć filter(), jak już robisz.

Możesz oczywiście również użyć:

map(threads => threads.find(thread => thread.theme.id === theme.id)),
filter(thread => thread !== undefined),
2
martin 3 czerwiec 2018, 07:26

Spróbuj używać następującego kodu.

getSelectedThemeThreads(theme): Observable<Thread[]> {
    return this.http.get<Thread[]>(this.threadsUrl)
    .map(res => res)
    .filter(thread => thread.theme.id == theme.id);
}    
0
Abel Valdez 2 czerwiec 2018, 22:05

Po prostu zmień map(threads => threads) do mergeAll()

0
Fabricio 3 czerwiec 2018, 12:42

Myślę, że szukasz grupoby Operator:

getSelectedThemeThreads(): Observable<Thread[]> {
  return this.http.get<Thread[]>(this.threadsUrl).pipe(
    groupby(thread => thread.id),
    mergeAll(group$ => group$.pipe(
      reduce((acc, cur) =>[...acc, cur], [])
    )
  );
}

Daj mi znać, jak działa ten kod. W każdym razie Jeśli chcesz się z tym grać, jakiś czas temu przyszedł z tym przykładem e, mam nadzieję, że pomoże ci wyjaśnić.

0
Luillyfe 3 czerwiec 2018, 19:40