私のangularプロジェクトにバグがありました。これは、コードを
_this.zone.run(() => {/* my code here */});
_
this 回答で述べたとおり。
zone
についての私の以前の理解は、angularはサードパーティライブラリの非同期callbacks
によって行われた変更を検出できないということでした。「それらはAngularのzone
にないためです。button
をクリックすると、イベントトリガーされるのはブラウザのネイティブclick
イベントではなく、angularによって作成されたカスタムの(パッチされた)click
イベントで、handler
がzone
で実行されるため、angularはコールバックハンドラによって行われた変更。
しかし、サードパーティのコールバックでrouter.navigate()
を実行してもこの問題が発生することを理解できませんでした( this githubの問題で示されています)。 Router
は、angular自体のservice
ではありませんか?サードパーティのzone
で呼び出されたときに、なぜ自動的にAngularのcallback
に通知しないのですか?
NGXSのステートレデューサー内で_router.navigate
_を使用することでこの問題が発生しました。
私の質問は:
コードをNgZone
でラップする必要があるのはいつですか?
何時間もデバッグして、コードがzone
コンテキスト外にあることを理解するのは面倒です。
ngZone.run()
は、ルーティングを単体テストするときに特に役立ちます。
it('should redirect if condition true, fakeAsync(() => {
router.navigate(['']);
fixture.ngZone.run(() => {
component.redirectIfConditionTrue();
});
tick();
expect(location.path()).toBe('/AgentLeadsManager');
}));
ngZone.runOutsideAngular()-angularゾーンの外でコードを実行します。
Angular自体は内部でngZoneを使用して変更を検出します
したがって、angularゾーンから出てきた場合、戻ってくるにはngZone.run()
を使用します
Zone.jsは、DOMイベント(
click
、keydown
、keyup
、etc
)、setTimeout
、setInterval
。XMLHttpRequest
s
NgZoneは単なるラッパーですangularサービスZone.js
のAPI。
Angularチームは、Angularに取り組んでいるため、実行コンテキストの抽象化が必要であるため、Zone.jsとラッパー(非公式-アダプターパターン)を構築したため、 Angularで。
だから基本的にあなたの質問に答えること:Zone.js内のAngularの実行コンテキストに結び付けられていないあらゆる種類のサードパーティライブラリを扱うとき(実行コンテキストが不要であり、作業できると判断しない限り なし = NoopNgZone
を使用して)