2016-04-12 18 views
1

この初心者の質問..私はAngular2のマニュアルを読んでてきた が、私は保存/利用可能な機能をキャンセル 作るために使用されているサービスを復元 階層的依存関係インジェクター章の例に出くわしたです編集のためにAngular2ドキュメント - 階層的依存関係インジェクター(サービスの復元)

これはサービスです。

export class RestoreService<T> { 
    originalItem: T; 
    currentItem: T; 
setItem (item: T) { 
    this.originalItem = item; 
    this.currentItem = this.clone(item); 
} 
getItem() :T { 
    return this.currentItem; 
} 
restoreItem() :T { 
    this.currentItem = this.originalItem; 
    return this.getItem(); 
} 
clone (item: T) :T { 
    return JSON.parse(JSON.stringify(item)); 
} 
} 

私はそれについてとても興奮していたので、私はそれを自分自身を試してみました! まず私はこのような値を設定しています:その後

ngAfterContentInit(){ 
    this.metadata = { 
     languages: this.selected_languages, 
     countries: this.selected_countries, 
     international: false 
    } 
} 
set metadata(metadata: CvMetadata){ 
     this._restoreService.setItem(metadata); 
} 
get metadata(): CvMetadata{ 
    return this._restoreService.getItem(); 
} 

私は例えばngModel でメタデータプロパティの値を変更しています:[(ngModel)]="metadata.languages[0]"

質問:私のsrupriseときのため
メタデータのプロパティ値がngModelで更新されます - currentItemは変更され、orginalItemは変更されていません!私が理解できないことは、それがどうやって可能なのかということです。私は、ngModelがメタデータのプロパティを設定するためにsetterを使用すると考えました。しかし、私は元のデータを設定すると、セッターは一度だけ呼び出されます。 ngModelは、originalItemではなくcurrentItemだけを変更する必要があることをどのように知っていますか? これは黒い魔法ですか?

私は知っている..私はこれを説明する誰かが必要ですが、残念ながら、または幸いにもあなただけがいる!

ありがとう!

+0

しかし 'languages [0]'の項目。 – Abdulrahman

+0

@Abdulrahman真はそれで論争することはできませんが、それは私の混乱の原因ではありません。どのようにcurrentItemだけを変更するのか..また、RestoreServiceはその機能をどのように提供しますか? –

答えて

1

RestoreService:2つの機能settergetterがあります。

setItem (item: T)セットoriginalItem、クローンそれとcurrentItemにクローンを保存します。

getItem()はちょうど

今、ngModelはその性質languagesを得るためにアイテムmetadataを取得currentItem(クローン化された項目)を返します。だからそれはcurrentItemになるでしょう。 ngModelが新しいプロパティ値を設定する場合、set metadata()は不要です。 の内部にlanguagesのプロパティを設定する必要があります。したがって、再度metadataが得られ、languagesプロパティが設定されます。

Here is a plunkerうまくいけば、それはそれを説明するの

別の方法に役立ちます。clone機能の

this.metadata = {language:['english']}; // you set metadata, effectively setting originalItem and cloning it to currentItem 

this.metadata.languages = ['arabic']; // you get metadata "currentItem", set its property languages. Never actually setting metadata itself 

注:RestoreService機能cloneは「実用的でオブジェクトのクローンを作成されていませんが"方法。 JSONパーサーを使用しているためです。`ngModel`は、` metadata`オブジェクト自身を `set/get`しません。詳細については、これらの質問を参照してください。122102728360

+0

私はちょうどそれをテストし、あなたは正しいです!これは混乱していました... "ゲッタを使って物をセットする"ということですが、私がそれを考えるとき、今は完璧な意味があります。説明してくれてありがとう! –

+0

@ChakijsTerzētājsあなたは大歓迎です。私は助けになることをうれしく思っています。 – Abdulrahman