我有2个Firebase列表:
我想从这两个列表中提取并将它们组合成一个可观察的列表。
为此,我尝试使用 merge :
import { Observable } from 'rxjs/Rx';
import 'rxjs/add/operator/merge';
items: Observable<any[]>;
this.items = this.af.list('/privateItems').merge(this.af.list('/publicItems'));
然后在视图中:
<ul>
<li *ngFor="let item of items | async">item.title</li>
</ul>
然而,这具有仅显示4个公共项目的效果。
合并是否适用于此?我如何将2个FirebaseListObservable合并为1个可以一起显示的Observable?
答案 0 :(得分:2)
试试这个
this.items = Observable.combineLatest(
this.af.list('/privateItems'),
this.af.list('/publicItems'),
(privateItems, publicItems)=> {
console.log(privateItems);
console.log(publicItems);
return [...privateItems, ...publicItems]
}
);
OR
this.items = this.af.list('/privateItems')
.flatMap(privateItems=> this.af.list('/publicitems')
.map(publicItems=> [...privateItems, ...publicItems])
);
更新
我得到了你案件中发生的事情。你得到了两个回复:
-----[privateItems] -------- [publicItems]-----
因此this.items获取第一个响应值,然后它将覆盖第二个响应值。但是根据您的要求,您需要将它们放在一起,因此使用reduce
可能会有所帮助。
this.items = this.af.list('/privateItems')
.merge(this.af.list('/publicItems'))
.reduce((total,current)=>[...total,...current],[]);
答案 1 :(得分:1)
很抱歉复活旧帖子,但这是我的组合可变数量的FirebaseListObservables的解决方案:
let rooms = ['room1', 'room2', 'room3'];
let observables = rooms.map((room) => { return this.cs.getMessagesByRoomId(room) });
this.messages = Observable.combineLatest(
observables,
(...rooms) => {
console.log('rooms',Array.prototype.concat(...rooms));
return Array.prototype.concat(...rooms)
}
);