Cip*_*ian 6 javascript firebase-realtime-database angularfire2 angular
下面的observable创建了一个事件对象数组.
eventsRef: AngularFireList<any>;
events: Observable<any>;
this.eventsRef = db.list('events');
this.events = this.eventsRef.snapshotChanges().map(changes => {
return changes.map(c => ({ key: c.payload.key, ...c.payload.val() }));
});
Run Code Online (Sandbox Code Playgroud)
我需要this.events
从其他数据库列表中添加其他数据.所以我需要每个事件对象包含一个访客计数和数据eventsFilters
.我不知道该怎么做.这是我到目前为止:
this.events = this.eventsRef.snapshotChanges().map(changes => {
changes.map(data => {
console.log(data.payload.key)
this.db.object(`/eventsFilters/${data.payload.key}`)
.valueChanges()
.subscribe(data => {
console.log(data) //event filters
})
})
changes.map(data => {
console.log(data.payload.key)
this.db.object(`/eventsGuests/${data.payload.key}`)
.valueChanges()
.subscribe(data => {
let guestCount = Object.keys(data).length;
console.log(guestCount)
this.guestCount = guestCount; //guest count
})
})
return changes.map(c => ({ key: c.payload.key, ...c.payload.val() }));
});
Run Code Online (Sandbox Code Playgroud)
编辑--------
我已经使用了这个,combineLatest
但我仍然不确定如何对每个事件数据进行分组.
this.eventsRef.snapshotChanges()
.switchMap(
(changes) => {
let userQueries: Observable<any>[] = [];
let lists: Array<string> = ['eventsFilters', 'eventsGuests'];
changes.map(data => {
for (let list of lists) {
userQueries.push(this.db.object(`/${list}/${data.payload.key}`).valueChanges());
}
})
userQueries.push(this.eventsRef.snapshotChanges());
return Observable.combineLatest(userQueries);
})
.subscribe((d) => {
console.log(d)
});
Run Code Online (Sandbox Code Playgroud)
console.log(d)
输出这样的东西:
[
{}, //object with data from eventsFilters for first event
{}, //object with data from eventsGuests for first event
{}, //object with data from eventsFilters for second event
{}, //object with data from eventsGuests for second event
...
[{},{} ...] //array with all events
]
Run Code Online (Sandbox Code Playgroud)
这是一个结合了 3 个可观察值的示例:
combinedData$ = combineLatest( entityList$, settings$, currentUser$).pipe(
map(([entityList, pageSetting, currentUser]) => {
//entityList, pageSettingand currentUser holds the last value emitted on each observables.
if (!pageSetting.ShowAllOrganisation) {
//If not showing all organisation, then we have to filter it
retVal = entityList.filter(entity=> entity.organisationId === currentUser.organisationId);
}
return retVal;
})
);
Run Code Online (Sandbox Code Playgroud)
组合最新将返回一个新的可观察值。如果 3 个可观察值之一发出新值,则将触发 mergeLatest 并发出新值。有关 mergeLatest 如何工作的更多信息,请访问官方文档
归档时间: |
|
查看次数: |
111 次 |
最近记录: |