【问题标题】:Firebase 'child_changed' listener understandingFirebase 'child_changed' 听众理解
【发布时间】:2019-06-09 03:52:29
【问题描述】:

我正在尝试从 Firebase 获取关于我系统生命周期中问题状态的实时更改。我的child_changed 事件的交互方式与我预期的不同,所以我不确定我是否正确使用它。

我想获取questionStatus 变量的新更改,这样如果系统上的另一个用户更改了数据库上的变量,则两个用户都可以实时看到更新。我的 Firebase 数据库是这样设置的:

-/questions
     -/ID1234567890
          -/title
          -/messages
               -/ID1234567890
               -/ID2345678901

'child_changed' 调用:

fire.database().ref('/questions/' + this.state.questionId + '/questionStatus').on('child_changed', snap => {
      this.setState({
        questionStatus: (snap.val().questionStatus),
      })
      console.log("CHANGED!")
    })

上面的代码是我认为它应该工作的方式,但我永远无法让 console.log 按预期显示。通过从ref() 中删除questionStatus(如下面的代码中所述),每当我向问题(用于聊天)添加新消息时都会触发该事件,并且似乎会导致加载错误。我是误解了firebase还是我的代码更深了?也许这与组件的生命周期有关?我试过把它放在任何地方都无济于事,但目前在componentWillMount()。让我知道你的想法,谢谢!

fire.database().ref('/questions/' + this.state.questionId).on('child_changed', snap => {
      this.setState({
        questionStatus: (snap.val().questionStatus),
      })
      console.log("CHANGED!")
    })

【问题讨论】:

    标签: javascript node.js reactjs firebase firebase-realtime-database


    【解决方案1】:

    根据我的研究,我没有完全理解setState(),不知道状态只能异步更新,不能同步。知道了这一点,我刚刚实现了一个功能,通知用户状态已更改并单击按钮重新加载。不理想,但它现在可以工作。

    我还测试了使用特定键 (messages) 排除儿童。

    所以我的新代码如下所示:

    fire.database().ref('/questions/' + this.state.questionId).on('child_changed', snap => {
          // Ignore if messages are being added to the ticket
          if(snap.key !== 'messages'){
            this.setState({
              questionStatus: (snap.val().questionStatus),
              questionTags: (snap.val().questionTags),
              question
            })
          }
        })
    

    【讨论】:

      猜你喜欢
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      • 2020-09-28
      • 2014-08-23
      • 2020-05-09
      相关资源
      最近更新 更多