由於所有的指令都可以作爲角服務,並在每一個指令編譯檢索,這樣做的最簡單的方法就是打補丁注射器:
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
可以在用戶模塊中打補丁。
謝謝 - 這非常酷!但它似乎仍然有時會低估自定義屬性指令。我花了一些時間試圖理解爲什麼,但流程難以遵循(_maybe_這是一些優化,涉及在後鏈接函數中重用對象?)。你知道修補$ compileProvider是否更可靠?我不介意爲我的本地運行修補Angular源代碼本身。 – Wolf
你能提供一個複製問題的例子嗎?我不認爲它可能低估了某些東西。我想這與'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
對不起,遲到的迴應。不幸的是,我們的應用程序非常龐大複雜,我無法輕鬆生成單獨的repro。我會給你關於$ compileProvider的一個嘗試。再次感謝您的想法! – Wolf