2017-09-20 4 views
1

コンポーネント内で、コンポーネント内で変更可能なサービスからオブジェクトをコピーしようとしましたが、サービス内にとどまるべきです。最後はoldを滞在する必要にもかかわらず、初期化後の 参照なしのAngular4コピーオブジェクト?

private test; 

public ngOnInit(): { 
    console.log(this.someService.test.someProperty) //'old' 
    this.test = this.someService.test; 

    //not working as well?! 
    //this.test = Object.assign({}, this.someService.test); 
    //this.test = Object.create(this.somerService.test); 

    this.changeTest(); 
} 

public changeTest(): void { 
    this.test.someProperty = 'new'; 
} 

両方

this.test.somePropertyなど this.someService.test.somePropertynewに変更されますか?

なぜことが起こっている、そしてどのようにのみthis.test

+0

どのようにサービスからこのオブジェクトを取得していることを証明するために、観察\ – JayDeeEss

+0

なしの公開テスト 'のように定義された通常のオブジェクト:?多分どんな= {...}' –

+0

あなたのローカルテストにそれを割り当てているときにも参照を渡します。ちょっと推測します...あなたのサービスでプライベートな主題を作成するのを避けるために何ができるのですか? – JayDeeEss

答えて

2

のプロパティを変更するにはObject.assignが浅いマージであるので、それはそれはトップレベルのみをマージしていますですので、トップレベルの両方で同じオブジェクトを参照していますサービスとそのコンポーネント。参照してください

this.test = _.merge({}, this.someService.test) 

this.test = JSON.parse(JSON.stringify(this.someService.test)); 

も参照してください:あなたはまた、深いクローンを持つオブジェクトができHow to deep merge instead of shallow merge?

を、私は深いマ​​ージオブジェクトに必要がある場合

は、私は個人的にlodashのマージを使用します:How to Deep clone in javascript

0

実際にオブジェクトassignはあなたの例のように動作します。 Created plunkerはそれが...

this.test = Object.assign({}, this.someService.test); 
関連する問題