2016-11-28 64 views
2

我目前正在分析一個巨大的Angular 1.5應用程序。作爲練習的一部分,我試圖打印每個指令的列表以及它被調用的次數。我想包括自定義指令和內置的指令(如ng-if)。如何計算每個指令被調用的次數(Angular 1. *)?

我採用了以不同方式檢測Angular源代碼的方法(例如,通過添加計數器來添加指令)。然而,迄今爲止我嘗試過的所有東西似乎都低估了這些指令。

有沒有人熟悉Angular內部?如果是這樣,你知道一個好辦法嗎?

回答

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

謝謝 - 這非常酷!但它似乎仍然有時會低估自定義屬性指令。我花了一些時間試圖理解爲什麼,但流程難以遵循(_maybe_這是一些優化,涉及在後鏈接函數中重用對象?)。你知道修補$ 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(){console.log(this.name);返回_compile.apply(this,arguments)}',但我想結果應該是相似的。 – estus

+0

對不起,遲到的迴應。不幸的是,我們的應用程序非常龐大複雜,我無法輕鬆生成單獨的repro。我會給你關於$ compileProvider的一個嘗試。再次感謝您的想法! – Wolf