【问题标题】:Ionic Angular Firestore: refresh list after deleting an elementIonic Angular Firestore:删除元素后刷新列表
【发布时间】:2021-08-06 05:10:50
【问题描述】:

删除项目后,我无法刷新我的元素列表。 而且,我不明白的是:为什么添加元素后它会起作用。有什么不同? 我寻找了多种解决方案,但没有找到一个好的解决方案。

我的服务

addWord(word: Word) {
    db.collection('words').add({
      name: this.toolsService.upperFirstletter(word.name),
      description: word.description
    })
      .then(() => {
        this.toastService.toastSuccess(`Le mot ${word.name} a bien créé !`);
      })
      ...
    this.emitWords();
  }

deleteWord(word: Word) {
    db.collection('words').doc(word.id).delete()
      .then(() => {
        this.toastService.toastSuccess(`Le mot ${word.name} a bien été supprimé !`);
      })
      ...
    this.emitWords();
  }

emitWords() {
    const listWords: Word[] = [];
    const wordCollection = db.collection('words').orderBy('name', 'asc').get();
    wordCollection
      .then((querySnapShot) => {
        querySnapShot.forEach((doc) => {
          listWords.push(
            new Word(
              doc.id,
              doc.data().name,
              doc.data().description
            )
          );
          this.listWords$.next(listWords.slice());
        });
      })
    ...
  }

它适用于add(),但不适用于delete()。感谢您的帮助!

【问题讨论】:

    标签: angular ionic-framework google-cloud-firestore ionic5 angular11


    【解决方案1】:

    如果您为firestore 启用了离线功能,请不要使用thenawait。只运行你的代码,就好像它是同步的:

    addWord(word: Word) {
        db.collection('words').add({
          name: this.toolsService.upperFirstletter(word.name),
          description: word.description
        })
         
            this.toastService.toastSuccess(`Le mot ${word.name} a bien créé !`);
          
          
          ...
        
      }
    
    deleteWord(word: Word) {
        db.collection('words').doc(word.id).delete()
          
            this.toastService.toastSuccess(`Le mot ${word.name} a bien été supprimé !`);
            
          
          ...
       
      }
    
    

    实时监听器的 Ant 使用 onSnaphost 就像这里:

    db.collection("words").orderBy('name', 'asc')
        .onSnapshot((querySnapshot) => {
            var words = [];
            querySnapshot.forEach((doc) => {
                words .push(doc.data().name);
            });
            console.log("Current cities in CA: ", words.join(", "));
        });
    

    这样您就无需在每次更改内容时都致电emitWords

    【讨论】:

    • 但这就是我在 delete() 中所做的。添加一个词,它的工作。即使 emit() 在 then 之外。你是对的,如果 emit() 在里面当然更好,但即便如此,刷新也不是每次都有效。
    • 我已经更新了我的答案。你能用新方法试试吗?
    • 好的,我认为它正在工作,非常感谢!所以,我将用 onSnapshot 替换我的 emit() (.then & .catch)。但是,如果我想异步执行此操作,请问该怎么做?而当我添加一个元素时,为什么异步方法起作用(列表被刷新)?在 firestore 集合中添加和删除元素有区别吗?
    • Firestore 默认离线工作,因此您无需使用异步调用。数据以同步方式添加,并在用户有互联网时同步。如果他已经拥有它,它会很快发生,如果没有,它会在他重新连接时发生。关于实时听众没有区别。也许检查你如何处理状态变化。
    • 好的。非常感谢塔里克!
    猜你喜欢
    • 2021-06-17
    • 2018-06-01
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多