我目前正在使用带有Firestore数据库和Angular的firebase构建项目。在我的Firestore数据库中,我有一个任务集合和一个所有者集合。每个任务都有对所有者(例如owner: -l3sdfkl3sdflksdf
)的引用(外键)。一个所有者可以链接到多个任务,其中一个任务只能有一个所有者。
在我的Angular组件之一中,我想显示我所有任务的列表,包括每个任务的一些所有者信息。我编写了一种服务方法来订阅任务集合,并且在该订阅中,我不想为每个任务订阅所有者。因为我的组件还希望在所有者属性之一(对于链接到一个任务的所有者)发生变化时被触发。
我目前正在考虑这样的事情,但是我想知道这是否明智,可维护,我应该如何退订等等等
getTasks(): Observable<Task[]> {
return this.afs.collection<Task>('tasks').snapshotchanges().map((actions: DocumentChangeAction[]) => {
let tasks: Task[] = [];
actions.forEach((action: DocumentChangeAction) => {
let task: any = { id: action.payload.doc.id, ...action.payload.doc.data() };
// Per task, subscribe to the owner, how?
this.getOwner(task.id).subscribe((owner: Owner) => {
task.owner = owner;
return tasks;
});
tasks.push(task);
});
return tasks;
});
}
我不喜欢在组件本身中进行每个所有者的检索,这可能是因为将来我有多个组件需要此任务列表,包括所有者,而我只是认为这不是组件的责任组件。
有关如何解决此类问题的任何提示?谢谢!
答案 0 :(得分:0)
首先,您可以将getOwner和task数据处理方法放在单独的task.service Service中。组件只需要处理UI逻辑,就流而言,您可以如下优化它 (假设您使用的是rxjs5)
getTasks(): Observable < Task[] > {
return this.afs.collection < Task > ('tasks').snapshotchanges()
.mergeMap((actions: DocumentChangeAction[]) => Observable.from(actions))
.switchMap((action: DocumentChangeAction) => {
let task: any = {
id: action.payload.doc.id,
...action.payload.doc.data()
};
// Per task, subscribe to the owner, how?
return this.taskService.getOwner(task.id).map((owner: Owner) => {
task.owner = owner;
return task
});
}).reduce((acc,curr)=>{
acc.push(curr)
return acc
},[])
}
答案 1 :(得分:-1)
也许您应该在看switchMap或RxJS的其他地图运算符; flatMap, mergeMap, switchMap and concatMap in rxjs?
这里给出了另一个清晰的例子; https://www.youtube.com/watch?v=6lKoLwGlglE