SnapshotChanges 订阅未检测到子集合项目的最终删除
SnapshotChanges subscription doesn't detect final deletion of sub-collection item
我有以下代码可以从 Cloud Firestore 中检索一些用户信息 - 它从用户文档的子集合中获取用户所属的挑战列表,然后使用这些 ID 从顶级挑战文档。
当我删除挑战时,我将其从主挑战文档中删除,然后删除每个用户挑战子集合中的 ID 引用。 UI 每次删除都会很好地更新,因为 snapshotchanges 是一个活动订阅,直到我删除最后一个。最后一个从数据库中删除但保留在 UI 中,直到我刷新或进行新的挑战。
我的理论是,因为删除挑战子集合中的最后一个文档也会删除子集合,这意味着 snapshotChanges 不会 运行 因为数据库中不再有集合来监视更改。
任何关于如何解决这个问题的想法都会很棒。
getChallenges() {
return this.getCurrentUserId().pipe(switchMap(userId => {
return this.db.collection(`users/${userId}/challenges`).snapshotChanges().pipe(
map(actions => actions.map(a => {
const data = a.payload.doc.data();
console.log('in get challenges: ', data);
const user_challenge_key = a.payload.doc.id;
return this.getOneChallenge(data['id'], user_challenge_key);
}))
);
}));
}
getOneChallenge(id, user_challenge_key = null): Observable<Challenge> {
return this.db.doc(`challenges/${id}`).snapshotChanges().pipe(
take(1),
map(changes => {
const data = new Challenge(changes.payload.data());
const challengeId = changes.payload.id;
data.user_challenge_key = user_challenge_key;
data.id = id;
console.log('in get One challenge: ', data);
return data;
})
);
}
也许维护一个虚拟文档以保留子集合
例如,验证您是否要删除该子集合的最后一个元素添加虚拟对象,然后删除最后一个元素
对于第一次插入,检查虚拟对象是否是唯一的文档,然后添加您的第一个条目并删除虚拟对象
我在 Firestore 的 Google 组
上发现了一个类似的 question 和类似的方法
我有以下代码可以从 Cloud Firestore 中检索一些用户信息 - 它从用户文档的子集合中获取用户所属的挑战列表,然后使用这些 ID 从顶级挑战文档。
当我删除挑战时,我将其从主挑战文档中删除,然后删除每个用户挑战子集合中的 ID 引用。 UI 每次删除都会很好地更新,因为 snapshotchanges 是一个活动订阅,直到我删除最后一个。最后一个从数据库中删除但保留在 UI 中,直到我刷新或进行新的挑战。
我的理论是,因为删除挑战子集合中的最后一个文档也会删除子集合,这意味着 snapshotChanges 不会 运行 因为数据库中不再有集合来监视更改。
任何关于如何解决这个问题的想法都会很棒。
getChallenges() {
return this.getCurrentUserId().pipe(switchMap(userId => {
return this.db.collection(`users/${userId}/challenges`).snapshotChanges().pipe(
map(actions => actions.map(a => {
const data = a.payload.doc.data();
console.log('in get challenges: ', data);
const user_challenge_key = a.payload.doc.id;
return this.getOneChallenge(data['id'], user_challenge_key);
}))
);
}));
}
getOneChallenge(id, user_challenge_key = null): Observable<Challenge> {
return this.db.doc(`challenges/${id}`).snapshotChanges().pipe(
take(1),
map(changes => {
const data = new Challenge(changes.payload.data());
const challengeId = changes.payload.id;
data.user_challenge_key = user_challenge_key;
data.id = id;
console.log('in get One challenge: ', data);
return data;
})
);
}
也许维护一个虚拟文档以保留子集合
例如,验证您是否要删除该子集合的最后一个元素添加虚拟对象,然后删除最后一个元素
对于第一次插入,检查虚拟对象是否是唯一的文档,然后添加您的第一个条目并删除虚拟对象
我在 Firestore 的 Google 组
上发现了一个类似的 question 和类似的方法