2017-07-06 3 views
1

コードの一部がAngular外から実行されたかどうかわからないときに、Angularゾーン内で関数を実行できるグローバル関数があります。ここでZoneをチェックして何かを保存していますか?

機能です:

export class Zones { 
    public static maybe(zone: NgZone, callee:() => any) { 
     return NgZone.isInAngularZone() 
      ? callee() 
      : zone.run(callee); 
    } 
} 

私はこの機能を使用して開始した後。私はこのチェックが冗長かどうか疑問に思った。たぶんNgZone.run()メソッドはすでにisInAngularZoneを呼び出していて、上記のロジックも実行しています。

Angularソースコードを見てみましたが、ゾーンは別のライブラリで処理されてしまい、実行パスに従うことを迷ってしまいました。

https://github.com/angular/zone.js/

は、だから私は上記の機能を使用し続けたが、それが必要だことを確認したい:

はここゾーンプロジェクトです。

答えて

2

NgZone.run()は、angularゾーンの場合はZone.prototype.run()への代理人に過ぎず、追加のフレームを防ぎません。むしろ、現在のangularゾーンの入れ子の深さを追跡するので、angularゾーン内のすべてのフレームが完了するまで、ゾーンの回転操作(例えば、検出の変更)を延期することができる。このため、あなたのガードは特定のケースでパフォーマンスが少し向上します。ただし、追加のゾーンフレームを追加するコストは非常に小さくすべきであることに注意してください。これは、非常に頻繁に呼び出される関数にとって最も有用な可能性があります。

NgZone源はここで見つけることができる: はhttps://github.com/angular/angular/blob/bebedfed24d6fbfa492e97f071e1d1b41e411280/packages/core/src/zone/ng_zone.ts#L233

NgZone.innerangularゾーン)上のタスクの呼び出しはネスティングレベルを管理し、必要なときangularゾーンターンイベントをトリガonEnter()onLeave()機能をトリガ。 (?すべての)ゾーンのターンに角度の主フックの

そして、多くのですApplicationRef_ソースは、適用され、ここで見つけることができます:変化検出のための https://github.com/angular/angular/blob/c59c390cdcd825cca67a422bc8738f7cd9ad42c5/packages/core/src/application_ref.ts#L443

キー文はthis.tick()です。 ApplicationRef.tick()関数は、変更検出サイクルをトリガするものです。

関連する問題