2016-05-02 12 views
1

私はionic2を使用していて、私は、クラスを実装:Angular2、doeのEventEmitterにはzone.runが必要ですか?

import {EventEmitter, Injectable} from 'angular2/core'; 
@Injectable() 
export class LocalPushClear extends EventEmitter<number> { 
    constructor() { 
     super(); 
    } 
} 

クラスはLocalPushClearを購読する別のコンポーネントにcordova plugin eventを接続するために私のコンポーネントの上で使用されて、私は、clearイベント、それが発火するものに耳を傾けます私はLocalPushClearを使用して放射し、他のいくつかのコンポーネントがサブスクライブ:

this._LocalPushClear.subscribe(data => { 
    // Some action is taken here 
}); 

事は、私が(そのが行われたときに)サブスクリプションのコールバックの実行後に実行する自動change detectionを期待していた、ということですが、それはそこのように思えます何も変更検出の実行は全くありません。私はclickボタンのようなやり方をしなければなりません。いくつかのアクションzone.runと、私はその有効な動作か多分何か間違っているのか分かりません。

編集: その角度NgZoneエミッタその基本的にカスタムイベントは(少なくとも私は思う)について知らないが、誰もが確認できた場合、私は、確信しているので、私はコードをトレースし、それがSubjectにつながります、多分将来私は非常に感謝することを説明します。

+0

あなたの**いくつかのアクション**は、LocalPushClearを購読している同じコンポーネント内のいくつかのプロパティを操作しています。少なくとも、変更検出の問題について言えばわかります。この場合、変更リクエストはコンポーネントドメイン外から来るので、**あるアクション**を 'zone.run'でラップする必要があります。 – RoninCoder

+0

@ハニー最初に、コメントのおかげで、バグは、私が使っている 'EventEmitter'が 'angular/core'からエクスポートされているということです。それを実装しているコードで、私は直接答えを探しています。「EventEmitterから角度/コアからエクスポートすると自動的に変更検出が実行されません」とか、何か間違っているかもしれません。 –

答えて

2

あなたは間違いなくではないEventEmitterを延長する必要があります。 EventEmitterは、@Output()でのみ使用されます。代わりにSubjectを使用してください。

EventEmitter(この方法で使用された場合)またはSubjectによって放出された値について角度が通知されません。通常、ObservableSubject)に新しい値を出力させるコードは、イベントハンドラまたはsetTimeoutから呼び出されたときに完了したときに変更検出を引き起こすコードによって実行されます。

あなたのケースでは、LocalPushClearを使用して新しい値を発行するコードがAngularsゾーン外で実行されているようです。

Observableがイベントを発生させた後に、https://stackoverflow.com/a/34829089/217408で説明されている方法の1つを使用して変更検出をトリガすることができます。

+0

ありがとうございます、私は '科目'を使用します。 –

関連する問題