【发布时间】:2020-05-27 12:48:55
【问题描述】:
在我的项目中,人们创建、加入、收藏或组织了一些活动。我已经阅读了很多这些问题。但是大部分代码没有那么复杂或者人们忘记订阅了......
我想获取某个时间段内的所有活动,然后添加创建者信息(姓名、图像等)并添加布尔值(如果检索这些活动的用户已加入/添加书签/组织了此活动)。我之前使用的代码会提供实时更新(例如,我通过将我的 userId 添加到参与者数组中来加入活动,并且 activity.joined 将更新为 true)。
之前的代码:
public getActivities(user: UserProfileModel): Observable<Array<ActivityModel>> {
const now: number = moment().startOf('day').unix();
const later: number = moment().startOf('day').add(30, 'day').unix();
return this.afs.collection<ActivityModel>(`cities/${user.city.id}/activities`, ref => ref
.where('datetime', '>=', now)
.where('datetime', '<=', later))
.valueChanges({ idField: 'id' })
.pipe(
map(activities => activities.map(activity => {
const bookmarked = activity.bookmarkers ? activity.bookmarkers.includes(user.uid) : false;
const joined = activity.participants ? activity.participants.includes(user.uid) : false;
const organized = activity.organizers ? activity.organizers.includes(user.uid) : false;
return { bookmarked, joined, organized, ...activity } as ActivityModel;
}))
);
}
我想将创建者添加为可观察对象,以便显示他们的姓名或个人资料图片的最新更改。但是随着这个代码更改,我的 getActivities 不再发出任何更新...
我的新代码:
public getActivities(user: UserProfileModel): Observable<Array<CombinedActivityCreatorModel>> {
const now: number = moment().startOf('day').unix();
const later: number = moment().startOf('day').add(30, 'day').unix();
return this.afs.collection<ActivityModel>(`cities/${user.city.id}/activities`, ref => ref
.where('datetime', '>=', now)
.where('datetime', '<=', later))
.valueChanges({ idField: 'id' })
.pipe(
concatMap(activities => {
const completeActivityData = activities.map(activity => {
const activityCreator: Observable<UserProfileModel> = this.getCreator(activity.creator);
const bookmarked = activity.bookmarkers ? activity.bookmarkers.includes(user.uid) : false;
const joined = activity.participants ? activity.participants.includes(user.uid) : false;
const organized = activity.organizers ? activity.organizers.includes(user.uid) : false;
return combineLatest([
of({ bookmarked, joined, organized, ...activity }),
activityCreator
]).pipe(
map(([activityData, creatorObject]: [ActivityModel, UserProfileModel]) => {
return {
...activityData,
creatorObject: creatorObject
} as CombinedActivityCreatorModel;
})
);
});
return combineLatest(completeActivityData);
})
);
}
代码变得有点复杂,我自己看不到解决方案。谁能提供一些帮助?
【问题讨论】:
-
this.getCreator返回的 observable 是否完整? -
我认为它完成了。请参阅下面我对 satanTime 的回答。
标签: javascript firebase google-cloud-firestore rxjs angularfire2