我在下面的代码中使用once('value')
来按索引检索用户的联系人列表。然后,如果有人更改description
,我的联系人列表将不会实时更新,因为它是once()
。我无法使用on()
,因为这会导致疯狂的查询泄漏。那么我应该在哪里放置on('child_added')
来监听每个节点。
getContacts(userID) {
var contactList = [];
this.ref.child('userContacts').child(userID).once('value', (contacts) => {
contacts.forEach((contact) => {
this.ref.child('users').child(contact.key()).once('value', (contact) => {
contactList.push({
key: contact.key(),
name: contact.val().name,
description: contact.val().description,
numberOfProduct: contact.val().numberOfProduct
});
this.setState({
dataSource: this.state.dataSource.cloneWithRows(contactList)
});
})
})
})
}
答案 0 :(得分:0)
如果要接收对象的更新,则必须附加一个on()
的侦听器。
如果要阻止将多个侦听器附加到同一个用户,请保留一个对象,以便为所连接的每个用户密钥保留侦听器。然后在附加新的用户侦听器之前,检查它是否已存在:
var userListenersByKey = {};
this.ref.child('userContacts').child(userID).once('value', (contacts) => {
contacts.forEach((contact) => {
if (!userListenersByKey[contact.key()]) {
userListenersByKey[contact.key()] = this.ref.child('users').child(contact.key()).on('value', (contact) => {
contactList.push({
key: contact.key(),
name: contact.val().name,
description: contact.val().description,
numberOfProduct: contact.val().numberOfProduct
});
this.setState({
dataSource: this.state.dataSource.cloneWithRows(contactList)
});
});
}
});
})
您还希望在某些时候删除这些侦听器,因此最好为child_added
倾听child_removed
和userContacts
并将其用于(可选)添加和删除用户监听器。