首页 > 解决方案 > Angular 代码神秘地赋值

问题描述

由于某种我不明白的原因,此代码将“temps”的值分配给 this.messages,任何帮助将不胜感激。我知道问题出在下面的代码块中,因为删除 .sort 部分会更改 this.messages 的输出顺序。

this.currentMessageSubject.subscribe(()=> {
  console.log('Refreshing messages')
  if (this.conversationId) {
    firebase.firestore().collectionGroup('conv').where("parentMessageId", "==", this.conversationId).get().then(async (querySnapshot) => {
      let temps: FirebaseMessages;
      let tempsMsgs = new Map();
      temps = this.messages;
      temps.messages = []
      
      querySnapshot.forEach((newConvo) => {
        const thing = { id: newConvo.id, ...newConvo.data() } as FirebaseMessage;
  
        if (!tempsMsgs.has(thing.id)) {
          tempsMsgs.set(thing.id, thing)
          temps.messages.push(thing);
        }
        
      })
      temps.messages.sort(function(a,b){
        return a.timestamp.seconds - b.timestamp.seconds;
      });
      temps.messages = temps.messages.filter((message) => {
        if (message.id) {
          return true;
        }
        
        return false;
      })
    })
  }
})

标签: javascriptangulartypescriptionic-framework

解决方案


如果将非原始值分配给变量(即对象),它将通过引用传递。

所以,在你的情况下,这一行:

temps = this.messages;

将与您相同的对象分配this.messages给您的temps变量。因此,编辑temps实际上也会编辑this.messages,因为两者都指向同一个对象。

您将必须克隆您的对象,并将克隆分配给您的temps变量。关于克隆 - 关于在 SO 上克隆对象有多个很好的答案,所以我不会在这里讨论,因为我们不知道messages.


推荐阅读