所以我在这个应用程序中内置了一个评论系统,当我从列表中删除评论时,所有这些都会从DOM中删除,除了最后一项。
我相信发生了一些事情,因为Firebase中评论树中的最后一项被删除,它会删除整个树,从而破坏正在观看该树的可观察流。最后一项确实被删除了,但是,该项目位于DOM中,即使数据库中不再存在该项目。
我不确定如何在我的组件中处理这类事情。
以下是调用删除功能的函数:
/**
* Remove a message
*/
removeMessage(messageId) {
this._messages.removeMessage(this.requestId, messageId)
}
在我的ngOnInit()中,我订阅了消息流,你可以在这里看到:
this.getDiscussionObs = this._messages.getCheckRequestDiscussion(this.requestId).subscribe(messages => {
if(messages) {
this.discussionMessages = messages;
} else {
this.discussionMessages = [];
}
});
这是我的getCheckRequestDiscussion()
功能:
getCheckRequestDiscussion(checkRequestId) {
// Get request ID
return this._af.database.list(`/request_discussions/${checkRequestId}`,
{
query: {
orderByChild: 'created_timestamp'
}
})
.switchMap(messages => {
return Observable.combineLatest(
messages.map(message => {
return this._af.database.object(`/users/${message.author_id}`)
}),
(...users) => {
messages.forEach((message, index) => {
users.forEach(user => {
if(message.author_id === user.$key) {
messages[index]['author'] = user;
}
})
})
return messages;
}
)
})
}
以下是我的提供商中的删除功能:
/**
* Remove a message
*/
removeMessage(checkRequestId, messageId) {
return this._af.database.list(`/request_discussions/${checkRequestId}/${messageId}`).remove();
}
奇怪之处在于我之前处理过这个问题,除了相应的DOM更新,但在这里不是。有没有人知道这里发生了什么?
提前致谢!
答案 0 :(得分:1)
问题很可能是由于您使用combineLatest
数组messages
而造成的:
...
.switchMap(messages => {
return Observable.combineLatest(
messages.map(message => {
return this._af.database.object(`/users/${message.author_id}`)
}),
...
您没有检查数组的长度。如果它是空的,combineLatest
返回的可观察量将不会发出任何东西。
你应该这样做:
...
.switchMap(messages => {
return messages.length === 0 ?
Observable.of([]) :
Observable.combineLatest(
messages.map(message => {
return this._af.database.object(`/users/${message.author_id}`)
}),
...