Angular中如何避免多Tab间问卷列表因引用同步更新?
解决多个Tab间问卷答案同步的问题
问题根源
你判断的完全正确:所有Tab的QuestionList共享了同一个引用。
- 每次调用
addNewGuaranteeTab时,直接把this.ElcQuestionsVM赋值给新Tab的QuestionList,这是引用传递,所有Tab的QuestionList指向同一个数组 - 数组里的
IElcQuestionViewModel是对象类型,哪怕用[...ElcQuestionsVM]浅拷贝数组,数组内的对象还是同一个引用,修改其中一个Tab的答案,其他Tab的对应对象也会跟着变化
解决方案:深拷贝问题列表及每个问题对象
需要为每个新Tab创建完全独立的QuestionList,包括数组本身和里面的每个问题对象。以下是两种可行的实现方式:
方式1:手动遍历复制每个问题属性(推荐,可控性强)
修改addNewGuaranteeTab方法,对每个问题对象进行属性复制,同时重置答案为空白:
addNewGuaranteeTab() { const GuaranteeTab: IGuaranteeDetails = { GuaranteeId: null, TypeofGuarantee: null, Amount: null, Supplier: null, QuestionList: this.ElcQuestionsVM.map(question => ({ QuestionId: question.QuestionId, Answer: null, // 新Tab默认空白答案 HelpText: question.HelpText, InfoButton: question.InfoButton, InputType: question.InputType, DataType: question.DataType })) }; GuaranteesList.push(GuaranteeTab); }
方式2:使用JSON序列化实现深拷贝(适合无复杂类型的场景)
如果你的IElcQuestionViewModel里没有函数、日期等复杂类型,可以用JSON序列化快速深拷贝,同样要重置答案:
addNewGuaranteeTab() { const GuaranteeTab: IGuaranteeDetails = { GuaranteeId: null, TypeofGuarantee: null, Amount: null, Supplier: null, QuestionList: JSON.parse(JSON.stringify(this.ElcQuestionsVM)).map(q => ({...q, Answer: null})) }; GuaranteesList.push(GuaranteeTab); }
验证效果
修改后,每个Tab的QuestionList都是独立的数组和对象,修改任意一个Tab的问卷答案,其他Tab的内容不会再同步变化。
内容的提问来源于stack exchange,提问作者shinde
相关产品推荐
相关产品推荐

