【问题标题】:How to listen on a single child change in react native firebase?如何在反应原生 Firebase 中监听单个孩子的变化?
【发布时间】:2016-07-03 18:13:05
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    如果您想接收对象的更新,您必须使用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)
                });
            });
          }
        });
    })
    

    您还需要在某个时候删除这些侦听器,因此最好为userContacts 侦听child_added 和child_removed,并使用它来(可选地)添加和删除用户侦听器。

    【讨论】:

    • 我试过了,但我仍然不知道userListenersByKey 做了什么。能给我深入解释一下吗?另外,我面临另一个问题,当数据更改时,我的ListView 创建另一行而不是修改现有行。我不确定它是否与这个问题有关。如果没有,我将提出一个新问题。提前致谢
    • 创建新行而不是修改现有行问题已修复。我的 [] 放错地方了
    • 我终于明白!userListenersByKey[contact.key()]的意思了
    猜你喜欢
    • 2019-07-09
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多