Cloud Firestore onSnapshot()仅在没有初始状态的情况下触发更改

时间:2020-06-18 05:24:26

标签: javascript firebase google-cloud-firestore

在Firestore文档(https://firebase.google.com/docs/firestore/query-data/listen)中,

您可以使用onSnapshot()方法收听文档。首字母缩写 使用您提供的回调进行调用可创建文档快照 立即使用单个文档的当前内容。然后, 每次内容更改时,另一个调用都会更新文档 快照。

但是,我只希望数据更改时触发我的监听器。我不希望它在应用加载时触发,以获取数据的初始状态。

我搜索了互联网,发现了一个提示。(Can Cloud Firestore onSnapshot() only trigger on changes, and not get the initial state?

如果您只想接收某些数据,则可能需要弄清楚 如何进行查询,例如,通过添加时间戳字段和 让客户仅查询自 一些以前的时间。

这意味着.where('createdDate', '>=', new Date())吗?

我把它放在我的代码中。例如,

firebase
  .firestore()
  .collection('script')
  .where('createdDate', '>=', new Date())
  .orderBy('createdDate', 'desc')
  .limit(1)
  .onSnapshot(function (querySnapshot) {
      querySnapshot.forEach(function (doc) {
        console.log(doc.data().text);
        const textarea = document.createElement('textarea');
        textarea.value = doc.data().text;
        textarea.rows = '5';
        textarea.cols = '40';
        textarea.id = 'textarea';
        const parent = document.getElementById('textbox');
        parent.appendChild(textarea);

        const upload = document.createElement('BUTTON');
        upload.innerHTML = 'スピーチを提出'
        upload.addEventListener("click", function(event){
          const resultText = document.getElementById('textarea');

          firebase.firestore().collection('final').add({
              text: resultText.value
          }).catch(function(error){
              console.error('Error writing', error);
          });
        });
        parent.appendChild(upload);
      });
    });

但是没有用。 你能给我什么建议吗?

1 个答案:

答案 0 :(得分:1)

由于@gso_gabriel的评论,我可以解决我的问题。

var initState = true;
firebase
  .firestore()
  .collection('script')
  .orderBy('createdDate', 'desc')
  .limit(1)
  .onSnapshot(function (querySnapshot) {
    console.log(`Received doc snapshot`);
    if (initState) {
        initState = false;
    } else {
        if (!querySnapshot.docChanges().empty) {     
            querySnapshot.forEach(function (doc) {
               console.log(doc.data().text);
               const textarea = document.createElement('textarea');
               textarea.value = doc.data().text;
               textarea.rows = '5';
               textarea.cols = '40';
               textarea.id = 'textarea';
               const parent = document.getElementById('textbox');
               parent.appendChild(textarea);

               const upload = document.createElement('BUTTON');
               upload.innerHTML = 'スピーチを提出'

               upload.addEventListener("click", function(event){
                  const resultText = document.getElementById('textarea');

                  firebase.firestore().collection('final').add({
                      text: resultText.value
                  }).catch(function(error){
                      console.error('Error writing', error);
                  });

              });
              parent.appendChild(upload);
            });
        }
    }
}, err => {
    console.log(`Encountered error: ${err}`);
});