在我的ThreadService类中,我有一个函数getThreads()
,它返回一个包含所有线程的Observable<Thread[]>
。
现在,我想要我的函数的另一个版本,通过一个选定的主题过滤我的线程: function getSelectedThemeThreads(theme: Theme)
。
我尝试使用操作符map
和filter
,但得到以下错误消息Property 'theme' does not exist on type 'Thread[]
。
下面是我正在编写的代码:
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)
);
}
提前感谢您的帮助。
发布于 2018-06-03 06:55:48
我做了一个这个StackBlitz / angular6-filter-result的例子
主要思想是在map()
中进行过滤,因为过滤器将获得一个对象数组。
getSelectedThemeThreads(theme: string): Observable<Flower[]> {
return this.http.get<Flower[]>(this.threadsUrl).pipe(
map(result =>
result.filter(one => one.theme === theme)
)
)
}
发布于 2018-06-03 15:26:13
你就快到了。使用此map(threads => threads)
不会做任何事情,但您可能希望使用下面的代码:
mergeMap(threads => threads) // will turn Observable<Thread[]> into Observable<Thread>
concatMap
或switchMap
也可以工作。mergeMap
操作符将迭代数组并分别发出每个项,这样您就可以像以前那样使用filter()
了。
当然,您还可以使用以下命令:
map(threads => threads.find(thread => thread.theme.id === theme.id)),
filter(thread => thread !== undefined),
发布于 2018-06-03 06:05:47
尝试使用以下代码。
getSelectedThemeThreads(theme): Observable<Thread[]> {
return this.http.get<Thread[]>(this.threadsUrl)
.map(res => res)
.filter(thread => thread.theme.id == theme.id);
}
https://stackoverflow.com/questions/50659367
复制相似问题