web-dev-qa-db-ja.com

Ngzone.run()を使用するのはいつですか?

私のangularプロジェクトにバグがありました。これは、コードを

_this.zone.run(() => {/* my code here */});
_

this 回答で述べたとおり。

zoneについての私の以前の理解は、angularはサードパーティライブラリの非同期callbacksによって行われた変更を検出できないということでした。「それらはAngularのzoneにないためです。buttonをクリックすると、イベントトリガーされるのはブラウザのネイティブclickイベントではなく、angularによって作成されたカスタムの(パッチされた)clickイベントで、handlerzoneで実行されるため、angularはコールバックハンドラによって行われた変更。

しかし、サードパーティのコールバックでrouter.navigate()を実行してもこの問題が発生することを理解できませんでした( this githubの問題で示されています)。 Routerは、angular自体のserviceではありませんか?サードパーティのzoneで呼び出されたときに、なぜ自動的にAngularのcallbackに通知しないのですか?

NGXSのステートレデューサー内で_router.navigate_を使用することでこの問題が発生しました。

私の質問は:

コードをNgZoneでラップする必要があるのはいつですか?

何時間もデバッグして、コードがzoneコンテキスト外にあることを理解するのは面倒です。

18
dasfdsa

ngZone.run()は、ルーティングを単体テストするときに特に役立ちます。

it('should redirect if condition true, fakeAsync(() => {
  router.navigate(['']);
  fixture.ngZone.run(() => {
    component.redirectIfConditionTrue();
  });
  tick();
  expect(location.path()).toBe('/AgentLeadsManager');
}));
  • 出典:私がこれを使用しなければならなかった唯一の時間
1
Brian Hanna

ngZone.runOutsideAngular()-angularゾーンの外でコードを実行します。

  • イベントが発生すると、変更を検出するようにangularに指示します。
  • MouseUp()またはmouseDown()イベントを使用している場合、すべての変更でangularに変更を検出するように指示します。
  • angular(これによりアプリのパフォーマンスが低下します)でこれらの変更を実行時に実行したくない場合は、angularの外で実行できます。ゾーン。
  • これとは対照的に、すべての更新を鋭く取得したい場合は、ngZone.run()を使用できます。変更検出を通常どおり実行することを意味します。

Angular自体は内部でngZoneを使用して変更を検出します

したがって、angularゾーンから出てきた場合、戻ってくるにはngZone.run()を使用します

1
Darshan Bhavsar

Zone.jsは、DOMイベント(clickkeydownkeyupetc)、setTimeoutsetIntervalXMLHttpRequests

NgZoneは単なるラッパーですangularサービスZone.jsのAPI。

Angularチームは、Angularに取り組んでいるため、実行コンテキストの抽象化が必要であるため、Zone.jsとラッパー(非公式-アダプターパターン)を構築したため、 Angularで。

だから基本的にあなたの質問に答えること:Zone.js内のAngularの実行コンテキストに結び付けられていないあらゆる種類のサードパーティライブラリを扱うとき(実行コンテキストが不要であり、作業できると判断しない限り なし = NoopNgZoneを使用して)

ソース

0
Muli Yulzary