2017-01-31 2 views
2

私は誰かがこれについて詳しく説明できるかどうか疑問に思います。セッターを使用して@Input()@Input()を使用すると、変化検出に関して異なる動作をしますか?例えば角2、セッターの@Inputはセッターのない@Inputとは異なる動作をしますか?

@Input() something: SomeType; 

-vs-

private _something; 

@Input() set something(something: SomeType) { 
    this._something = something; 
} 

get something(): SomeType { 
    return this._something; 
} 

明らかな差はセッター/ゲッターは、いくつかの余分なロジックを@Input()可能にすることです。しかし、これはセッターなしで@Input()を使用する場合とは異なる方法で変化の検出に影響しますか?

答えて

3

角度が大きく変わることはありません。入力が設定されないか、セッターが頻繁に呼び出されません。ただし、セッター内にロジックが追加され、別の変更検出をトリガーできる警告があります。あなたがそれを持っている場合、角は既知のエラーを投げます(開発モードでのみ)

チェックした後の表現が変更されました。

ので、変化検出器は異なる動作をしませんが、問題は、あなたがセッターの内側に入れ、余分なものをロジックに応じて発生する可能性がある

+0

「あなたがいることを持っている場合は、角度は開発モードでは、既知のエラーを(スローされます) "set関数内の' setTimeout() 'や' this.changeDetectorRef.detectChanges(); 'のようなものは常にそのエラーを投げますか? –

+0

いいえ、実際には投げないようにします。しかし、テンプレート内でセッター内で使用される別のプロパティを設定した場合、そのエラーが発生する大きな可能性があります。 – PierreDuc

2

angleの視点からは、唯一の違いは、それらの@Input()のget/set関数をフックする機会があることです。

Javascriptのビューから、最初は「ちょうど」プロパティ、2番目はObject.definePropertyとなります。

plunker:セッターとhttps://plnkr.co/edit/1koamZCvyG5YAIPNB73r?p=preview

コンパイルされたコード:セッターなし

Object.defineProperty(AppComponent.prototype, "test1", { 
    get: function() { return this._test1; }, 
    set: function (val) { 
     console.log('test1 was set!'); 
     this._test1 = val; 
    }, 
    enumerable: true, 
    configurable: true 
}); 
__decorate([ 
    __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(), 
    __metadata('design:type', Object), 
    __metadata('design:paramtypes', [Object]) /* difference? */ 
], AppComponent.prototype, "test1", null); 

コンパイルされたコード:ng build

__decorate([ 
    __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(), 
    __metadata('design:type', Object) 
], AppComponent.prototype, "test2", void 0); 

angular-cliでコンパイル両方。

関連する問題