2017-01-23 14 views
0

コンポーネント間の変化の検出とデータの流れに関してAngular2(最終)に問題があります。私はそれの周りに働いているが、私に少しハッキーのように思われる それを行うより良い方法があるかどうか疑問に思っていた。角度2の変化の検出「式がチェックされた後に変化しました」

基本的に私はすべてのコンポーネントCの子コンポーネントC.

の数を作成し、子コンポーネントBとも* ngForを持っている成分Aを持って、親コンポーネントで処理され定義された@OutputがありますコンポーネントBの@Inputとして使用されるコンポーネントAの別のプロパティが決定されます。

コンポーネントモードでは、コンポーネントCの@Outputがトリガされるたびに、私はコンソールの下でエラーの下になっています:

Expression has changed after it was checked. Previous value: XX. Current value: XX. 

これについては、Angular2の単方向データの流れが原因で予想されます。私は自分のシナリオで正しく動作させる方法を知りましたか?

Iを一時的成分AにChangeDetectorRefを注入し、私はその非常に効率的ではないカントーその心配C. のインスタンスから@Outputイベントを処理する関数でそのdetectChanges()メソッドを呼び出します。私はおそらくそれを改善しようとし、最後のアイテムのイベント(すべてのCコンポーネントが同時にそのイベントを送信する)後にそれを呼び出すことができますが、私はイベントの非同期の性質といくつかの予期しない動作を心配します。

誰もこの問題を解決する方法を知っていますか?私のデザインは、コンポーネント間のデータフローに関して根本的に欠陥がありますか? データを交換する代わりに共有サービスのようなものを使うべきでしょうか?

ご迷惑をおかけして申し訳ございません。

+0

変更検出の実行によってモデルが変更されると、エラーがスローされます。たとえば、変更検出によって呼び出される 'ngOnChanges()'でモデルを変更する場合です。原因を追跡するために、より多くのコードを参照する必要があります。多くの場合、呼び出されるたびに新しいオブジェクトインスタンスを返す関数がバインドされているときに発生します。 –

+0

@GünterZöchbauerそれは何か起こるものです。コンポーネントCのすべてのインスタンスは、イベントを発行し、親コンポーネントAのモデル変更をもたらすngOnChanges()を持っています。 – Zyga

答えて

4

あなたはprivate cdRef:ChangeDetectorRefを注入し、ngOnChanges()の終わりにthis.cdRef.detectChanges()を呼び出すことができます。このようにAngularランは検出を再度変更し、以前に修正されたモデル値については不平を言いません。

class MyComponent { 
    constructor(private cdRef:ChangeDetectorRef) {} 

    ngOnChanges(changes) { 
    this.xxx = ... 
    ... 
    this.cdRef.detectChanges(); 
    } 
} 
+0

私がngOnChangesでこれを行うと、コンポーネントAの子プロセスで発生し、コンポーネントAの別の子Bの値を変更する(イベントをAに戻し、関連するプロパティを更新することによって)子供Bのための入力として使用される)。しかし、Cから受け取ったイベントを処理するコンポーネントのAメソッドではうまくいくでしょう。私はちょうどAngular2でそれを行う "ハッキー"だと思っていました。 – Zyga

+0

通常、オブザーバブルとの共有サービスを使用することをお勧めします。オブザーバブルは、変化の検出を伴う邪悪を引き起こさない。 –

関連する問題