如何听取一个孩子的变化反应原生火力基地?

时间:2016-07-03 18:13:05

标签: javascript firebase react-native firebase-realtime-database

我在下面的代码中使用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)
                });
            })
        })
    })
}

1 个答案:

答案 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_removeduserContacts并将其用于(可选)添加和删​​除用户监听器。