javascript - 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;
})
})
}
})
解决方案
如果将非原始值分配给变量(即对象),它将通过引用传递。
所以,在你的情况下,这一行:
temps = this.messages;
将与您相同的对象分配this.messages
给您的temps
变量。因此,编辑temps
实际上也会编辑this.messages
,因为两者都指向同一个对象。
您将必须克隆您的对象,并将克隆分配给您的temps
变量。关于克隆 - 关于在 SO 上克隆对象有多个很好的答案,所以我不会在这里讨论,因为我们不知道messages
.
推荐阅读
- javascript - 展开一个 div 元素 onClick 总是展开同一个 div 元素
- python - 如何打印列表中元素的索引 - python
- ionic-framework - IONIC 5页脚如何摆脱页脚图标上方的栏?
- google-cloud-platform - 尝试从 Firebase 部署的 NextJs 应用程序访问 NestJs Google VM 服务器时出错
- python - VS Code 内核为空
- docker - 我可以在 MySQL docker 容器中运行 cronjob 吗?
- python-3.x - 如何从嵌套字典中迭代嵌套字典的“值”
- c++ - 使用 CMake 从没有相对路径的子目录导入
- sql-server - 获取选中复选框的所有值并在 SQL 语句中使用
- r - 自动检测散点图中的不同区域,然后提取并使用特定区域进行进一步绘图