AngularFire2 Observables - 如何在 UI 中计算树中最后删除的项目?
AngularFire2 Observables - How to account for last removed item in a tree, in the UI?
所以我在这个应用程序中内置了一个评论系统,当我从列表中删除评论时,所有评论都会相应地从 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相应更新,但这里没有。有人知道这里发生了什么吗?
提前致谢!
问题很可能是由于您将 combineLatest
与 messages
数组一起使用:
...
.switchMap(messages => {
return Observable.combineLatest(
messages.map(message => {
return this._af.database.object(`/users/${message.author_id}`)
}),
...
你没有检查数组的长度。如果它是空的,combineLatest
返回的 observable 将不会发出任何东西。
你应该这样做:
...
.switchMap(messages => {
return messages.length === 0 ?
Observable.of([]) :
Observable.combineLatest(
messages.map(message => {
return this._af.database.object(`/users/${message.author_id}`)
}),
...
所以我在这个应用程序中内置了一个评论系统,当我从列表中删除评论时,所有评论都会相应地从 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相应更新,但这里没有。有人知道这里发生了什么吗?
提前致谢!
问题很可能是由于您将 combineLatest
与 messages
数组一起使用:
...
.switchMap(messages => {
return Observable.combineLatest(
messages.map(message => {
return this._af.database.object(`/users/${message.author_id}`)
}),
...
你没有检查数组的长度。如果它是空的,combineLatest
返回的 observable 将不会发出任何东西。
你应该这样做:
...
.switchMap(messages => {
return messages.length === 0 ?
Observable.of([]) :
Observable.combineLatest(
messages.map(message => {
return this._af.database.object(`/users/${message.author_id}`)
}),
...