2016-12-21 2 views
1

私はAngular 2を使ったElectronアプリを持っています。アプリケーションはipcRendererを使ってローカルのJSONファイルからデータをロードするまでうまく動作します。その後、サービス内のデータに作用するボタンは、変更検出プロセスを起動してビューを更新しなくなりました。 https://github.com/marshmellow1328/electron-angular-change-detection角2の変化の検出は電子で中断します

ボタンがネイティブの変更検出をトリガーするのを止めない理由は何もわかりません。 ChangeDetectorRefを追加する必要はないようです。もしそうなら、私は理由を理解したいと思います。

+0

「何もしない」をクリックすると、ビューが有効な状態に更新されますか? – Piou

答えて

3

私はあなたの問題を調査し、readFileハンドラが角度ゾーン外で実行されたために発生したと判断しました。したがって、変更検知の責任をゾーンに委ねたので、クリックイベントに反応しません。

これで最も簡単な解決策は何ですか?

app.component.ts

constructor(private zone: NgZone) { 
... 
this.zone.run(() => { 
    data.values.forEach((value) => { this.service.addValue(value); }); 
}); 

、その後、あなたが明示的にコードを作るzone.run(...)this.changeDetector.detectChanges();

を取り除くことができますがAngularsゾーン内で実行し、その後に実行された検出を変更します。

もう一つのアドバイス:

は、私は次のようにあなたのapp.component.tsでreduntantコードに気づいた:

private service: Service; 

constructor(service: Service) { 
    this.service = service; 
} 

あなたはそれが好き書き直すことができます。

constructor(private service: Service) {} 

希望、これはあなたを助けます!

+0

そのため、ゾーン(および変更の検出)は、データではなくイベント(ボタンをクリック)上で実行されたという印象がありました。これは別のことを示唆している。あなたはそれについて何か知っていますか? – Marshmellow1328

+1

Zoneは 'ipcRenderer.on( 'load''と' fs.readFile'イベント)にパッチを張りません。Zone.currentはゾーンです。 'cd.detectChanges()'を実行しているとき、angular2は ' 'ゾーンとclickイベントは' 'ゾーンに追加されますhttp://take.ms/uCa9h – yurzui

+1

次に、この入門書をご覧くださいhttps://docs.google.com/document/d/1F5Ug0jcrm031vhSMJEOgp1l-Is -Vf0UCNDY-LsQtAIY/edit#heading = h.92cgufnov62k '非同期作業がスケジュールされると、コールバック関数は非同期API呼び出し時に存在していたゾーンと同じゾーンで実行されます。 ' – yurzui