Angular-修改内部订阅对象

时间:2019-07-08 12:41:28

标签: typescript

我有方法getParameters()返回一个设置对象,该对象包含一个参数列表,我在内部实现了代码,并在显示新对象时在参数列表中添加了一些项目,当我显示新对象时,发现该列表具有添加的项目,但是问题是当我显示返回的对象时,我发现它也发生了改变

this.settingService.getParameters().subscribe((setting: Setting) => {
    const settingToSave = setting;

    this.parameters.forEach(element => {
       if (settingToSave.parameters.some(parameter => parameter.parameterId === element.parameterId)) {
          settingToSave.parameters = settingToSave.parameters.filter(parameter => parameter.parameterId != element.parameterId);
       }
        settingToSave.parameters.push(element);
     });

    console.log(settingToSave);
    console.log(setting); // same content as the object settingToSave

}

2 个答案:

答案 0 :(得分:1)

通过const settingToSave = setting,您正在创建参考,而不是副本。因此,当您修改settingToSave的属性时,与直接修改setting时一样,您正在修改同一对象

一个简单的示例,显示引用和副本之间的区别(在这种情况下,我正在使用JSON.parse(JSON.stringify(...))创建副本,对于实际的实际项目,我不建议这样做):

const original = {"property":"value"};
const reference = original;
const copy = JSON.parse(JSON.stringify(original));

reference.property = "new value";

console.log(reference.property === original.property);
console.log(copy.property !== original.property);

有关替代方法,请参见How to Deep clone in javascript

答案 1 :(得分:0)

在许多编程语言中,当您尝试通过执行A = B复制 object 变量时,您是通过引用而不是通过值来复制变量。因此,对A所做的任何更改都将应用于B,反之亦然。如果要复制对象变量并对其进行更改而又不影响其原始声明,请使用以下(ES6):

  

let newObj = Object.assign({},originalObj);

或在您的情况下替换以下行:

  

const settingToSave =设置;   与:   让settingToSave = Object.assign({},setting);

使用的来源:MDN Object assign