2016-11-28 5 views
2

私は現在、Angular 1.5アプリをプロファイリング中です。この演習の一環として、各ディレクティブのリストとその呼び出し回数を出力しようとしています。カスタムディレクティブと組み込みディレクティブ(ng-ifなど)の両方を含めることができます。各ディレクティブが呼び出される回数(Angular 1. *)をどのように数えることができますか?

Angularソースコードをさまざまな方法で計測するアプローチを取った(addDirectiveにカウンタを追加するなど)。しかし、今まで私が試したことのすべては、指令の数が少なかったようです。

角度のある内部構造に詳しい人はいますか?もしそうなら、あなたはこれを行う良い方法を知っていますか?すべてのディレクティブは、角のサービスとして利用でき、すべてのディレクティブのコンパイルに取得しているので

答えて

1

は、これを行うための最も簡単な方法は、パッチインジェクタにある:

app.run(($injector) => { 
    $injector._get = $injector.get; 

    $injector.get = function (name) { 
    var instance = this._get.apply(this, arguments); 

    if (/Directive$/.test(name)) { 
     var countPerDirectiveName = instance 
     .map(ddo => ddo.multiElement ? 0.5 : 1) 
     .reduce((countPerDirectiveName, count) => countPerDirectiveName + count) 

     console.log(name, countPerDirectiveName); 
    }; 

    return instance; 
    } 
}); 

$compileProvider.directiveにパッチを当てることにより、ディレクティブの制御を取ることも可能ですしかし、組み込みディレクティブの場合は、コアngモジュールに登録されているため、$compileProviderがユーザモジュールにパッチ適用される前に、組み込みディレクティブを実行するのは難しいでしょう。

+0

ありがとうございます - これは非常にクールです!しかし、カスタム属性ディレクティブは時には未定義に見えます。理由を理解しようとしていましたが、フローを追うのは難しいです(ポストリンク関数でオブジェクトを再利用する最適化が必要なのかもしれません)。 $ compileProviderのパッチがより信頼できるかどうか知っていますか?ローカルランのためにAngularソースコード自体にパッチを当てても構いません。 – Wolf

+0

問題を再現するサンプルを提供できますか?私はそれが何かを下回る可能性はないと思う。私は 'addDirective'パッチとほぼ同じことだと思います。 [このコード部分](https://github.com/angular/angular.js/blob/v1.5.8/src/ng/compile.js#L1101-L1105)の後にコンパイル機能をパッチすることができます。 'var _compile = directive.compile; directive.compile = function(){コンソール。ログ(this.name); return _compile.apply(this、arguments)} '、しかし、結果は似ているはずです。 – estus

+0

遅れて申し訳ありません。残念なことに、私たちのアプリは非常に大きく複雑なので、私は簡単に分離されたreproを生成することができませんでした。 $ compileProviderを試してみてください。アイデアをもう一度ありがとう! – Wolf

関連する問題