Angular 4 экземпляр переменной изменен с локальной переменной - PullRequest
0 голосов
/ 10 мая 2018

Когда я изменяю свойство isPublish localCampaign после того, как скопирую CampaignData, свойство isPublish для CampaignData также будет изменено ", чтобы увидеть комментарии в приведенном ниже коде, где это происходит"

export class CampaignNotificationDetailPage {
campaignData: any;

   publishCampaign() {
  let localCampaign = this.campaignData;
  localCampaign.isPublish = true;  //this also updates the this.campaignData.isPublish to true?
    }
   }

Как заблокировать изменения в CampaignData и почему это происходит?

Ответы [ 4 ]

0 голосов
/ 10 мая 2018

объект в javascript является ссылочным типом, поэтому вы должны найти способ применить клонирование объекта, это один из способов решить эту проблему:

export class CampaignNotificationDetailPage {
 campaignData: any;

    publishCampaign() {
    let localCampaign = object.assign({},this.campaignData);
    localCampaign.isPublish = true; 
    }
   }

другой способ:

export class CampaignNotificationDetailPage {
  campaignData: any;

       publishCampaign() {
       let localCampaign  {...this.campaignData}
       localCampaign.isPublish = true; 
        }
       }

этот ответ дает хорошее объяснение Как сделать Deep clone в javascript

0 голосов
/ 10 мая 2018
let localCampaign = JSON.parse(JSON.stringify(this.campaignData));

Это сделает копию.

0 голосов
/ 10 мая 2018

Да, он изменяет значение campaignData, даже если let имеет ограниченную область.

Когда мы делаем

let localCampaign = this.campaignData;

localCampaign указывает на this.campaignData, а когда вы изменяете значения в localCampaign, оно отражается в this.campaignData.

И после черного publishCampaign (т.е. {}) localCampaign будет удален из памяти.

0 голосов
/ 10 мая 2018

Это потому, что localCampaign назначено с this.campaignData.Теперь this.campaignData указывает на на месте сказать ссылки местоположение

1005 * И когда вы говорите
localCampaign=this.campaignData;

Вы не что иное, указывая localCampaign опорному расположения this.campaignData

Следовательно, когда this.campaignData изменяется, localCampaign постепенно изменяется, поскольку они указывают на одно и то же контрольное местоположение.Эта концепция называется call by reference.

. Вы можете назначить клонированный объект localCampaign

function clone(obj) {
    if (null == obj || "object" != typeof obj) return obj;
    var copy = obj.constructor();
    for (var attr in obj) {
        if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
    }
    return copy;
}

Теперь вы можете использовать вышеуказанный метод для клонирования this.campaignData

let localCampaign=clone(this.campaignData);
...