Firebase on value事件仅触发一次

时间:2017-03-28 23:30:16

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

在我的React Native iOS应用程序中,可以同时安装多个组件实例。

  

想想Instagram - 当用户在Instagram中点击照片然后点击照片所有者的头像时,用户场景就会从右侧推进。

     

如果她继续点击用户照片列表中的相同照片,第一个场景的克隆也将从右侧推进。

我需要安装场景的所有实例,建立Firebase侦听器,获取初始数据的快照并在此之后监听更改。

一切都适用于第一个组件实例。

但是,在任何后续实例中,都会定义侦听器,但是它们的回调不会立即执行,因此组件不会收到快照。

值得注意的是,当数据发生变化时,两个听众执行执行回调。

constructor(props) {

  super(props);

  const { uid } = props;

  // Set firebase refs
  this.postsRef = firebase.database().ref('posts');
  this.hostsRef = firebase.database()
    .ref(`users/${uid}/host`)
    .orderByChild('startTime');

  this.hostedPostRefs = {};

  // Keep a raw copy of the hosts
  this.hostedPosts = {};

  // ListView DataSource instance
  this.hostedPostsDataSource = new ListView.DataSource({
    rowHasChanged: (r1, r2) => r1._key !== r2._key,
  });

  // Initial State
  this.state = {
    loading: true,
    hostedPostsDataSource: this.hostedPostsDataSource.cloneWithRows(this.hostedPosts),
  };
}

componentDidMount() {
  this.hostsRef.on('value', this._onHostsReceived)
}

componentWillUnmount() {
  this.hostsRef.off();
  forEach(this.hostedPostRefs, hostedPostRef => {
    hostedPostRef.off()
  })
}

_onHostsReceived = (snapshot) => {
  snapshot.forEach(this._requestPost)
};

_requestPost = (snapshot) => {

  const { key } = snapshot;

  if (!this.hostedPostRefs[key]) {
    this.hostedPostRefs[key] = this.postsRef.child(key);
    this.hostedPostRefs[key].on('child_changed event', this._onPostReceived)
  }
};

_onPostReceived = (snapshot) => {
  this.hostedPosts[snapshot.key] = snapshot.val();
  this.setState({
    hostedPostsDataSource: this.hostedPostsDataSource.cloneWithRows(this.hostedPosts)
  });
};

以下是Firebase docs必须说的内容:

  

通过将异步侦听器附加到a来检索Firebase数据   firebase.database.Reference。监听器被触发一次   数据的初始状态,并且在数据发生变化的任何时候都会再次出现。

我正在使用React Native Firebase。鉴于此,我不确定这是否是React Native Firebase或Firebase的API中的错误。

1 个答案:

答案 0 :(得分:1)

React Native Firebase撰稿人

It was explained to me,该库的数据库实施中存在错误,并且将在不久的将来解决。

相关问题