2017-10-13 10 views
1

コンポーネントレベルでプロパティの変更に反応する最善の方法は何ですか?私が探しているのは、コンポーネントのプロパティの1つが変更されるたびにメソッドをトリガする方法です。ここで、単一のコンポーネントの上記の例で角度2で検出されるプロパティの検出

@Component({selector: 'component', template: '{{name}} {{number}}'}) 
class singleComp { 
    name: string = 'Old'; 
    number: number = 1; 

    changeProperties() { 
    this.name = 'New'; 
    this.number = 2; 
    } 

    changesDetected() { 
    console.log('Changes detected'); 
    } 
} 

、singleComp 2つのプロパティnamenumberを有しています。これは簡単な例です。 changesDetected()changeProperties()から呼び出すことは、コンポーネントのプロパティを変更する複数のメソッドを持つ可能性があるため、オプションではありません。私はchangesDetected()に、プロパティを変更する各メソッドの終わりに呼びたくはありません。これは、複数のメソッドからの複数の呼び出しを意味するためです。

私はOnChangesAfterContentCheckedを使って変更を検出しようとしましたが、実際には動作しません。これらのメソッドは、@inputプロパティの変更を検出しますが、コンポーネント内の「ネイティブ」プロパティの変更は検出しません。

まもなく説明

は、私が changesDetected()部品の内部プロパティが変更されるたびに発射する方法を探しています。

編集

ngDoCheckは内部の変更を検出したことは事実です。しかし、実装されると、外部コンポーネントの変更も検出され、コンポーネントレベルではそれほど有用ではありません。

+0

[@Inputまたは@Outputなしの変更での角2ウォッチコンポーネントプロパティの複製(https://stackoverflow.com/questions/39111323/angular-2-watch-component-property-入力または出力なしの変更) –

+0

@AnteJablanAdamović、私は '@ input'の変更の検出を探していないという質問に書いています。興味のあるものは、コンポーネントのネイティブプロパティの内部的な変更に関連しています。 – Treeindev

+0

他のスレッドをもう一度読むと、わからない場合は英語のチュートリアルをお勧めします。 'without' –

答えて

0

あなたはEventEmitterまたはこのユースケースを使用する必要があります。

帽子は、コンポーネントレベルでのプロパティの変更に反応する最良の方法ですか?私が探しているのは、コンポーネントのプロパティの1つが変更されるたびにメソッドをトリガする方法です。

@Component({selector: 'component', template: '{{name}} {{number}}'}) 
class singleComp { 
    name: string = 'Old'; 
    number: number = 1; 
    private propertiesChanged: EventEmitter<any> = new EventEmitter(); 
    private _score: number; 

    get score():boolean { 
    return this._score; 
    } 

    set score(s:number) { 
    this._score = s; 
    this.propertiesChanged.emit(s); 
    } 

    constructor() { 
    this.propertiesChanged.subscrive(() => this.changesDetected()); 
    } 
    changeProperties() { 
    this.name = 'New'; 
    this.number = 2; 
    this.propertiesChanged.emit({}); // you can pass any object here, chanegd properties as well. 
    } 

    changesDetected() { 
    console.log('Changes detected'); 
    } 

}

ます。また、ご利用の場合に、より理にかなって何でも選択し、これらのプロパティのセッターに変更イベントを発することができる:ここでは、単一のコンポーネントです。例えばスコアプロパティを参照してください。

+0

私はあなたのアプローチが気に入っていますが、プロパティを変更する各メソッドの内側に新しいコード行を実装する必要があります。 'changesDetected()'メソッドを直接呼び出すのと同じ効果があります。 リスナーをコンポーネントのプロパティに直接アタッチし、変更されるたびに反応する可能性がありますか? – Treeindev

+0

これをプロパティセッターで実装する場合は、これをどこにでも置く必要はありません。これはセッターに入れるだけです。 –

+0

https://stackoverflow.com/a/12850536/5767992これを例に見てください –

関連する問題