登録されているすべてのディレクティブ、サービス、コントローラーなどのリストを実行時に取得できますか? . . ?
4 に答える
各モジュールのプロバイダー (サービス/ディレクティブ/コントローラー/ファクトリーなど) のリストを取得できますが、リストはわかりにくいものです。
次のものがあるとします。
var mod = angular.module('myModule', []);
mod.factory('fact1', function($dependency1, $dependency2){ ... });
mod.service('serv1', function($dependency3, $dependency4){ ... });
mod.controller('ctrl1', function($dependency2, $dependency3){ ... });
mod.factory('fact2', function($dependency1, $dependency4){ ... });
...
次に、mod
変数には、mod._invokeQueue
そのモジュールの一部であるすべてのプロバイダーの配列を含むという属性が含まれます。は次の_invokeQueue
ようになります。
[
['$provide', 'factory', Arguments['fact1', ['$dependency1', '$dependency2', function(){}],
['$provide', 'service', Arguments['serv1', ['$dependency3', '$dependency4', function(){}],
['$provide', 'controller', Arguments['ctrl1', ['$dependency2', '$dependency3', function(){}],
['$provide', 'factory', Arguments['fact2', ['$dependency1', '$dependency4', function(){}]
...
]
mod._invokeQueue
そのため、含まれている各プロバイダーを検索できます。
ただし、その特定のモジュールのプロバイダーのリストのみが含まれます。すべての依存モジュールのリストを取得したい場合は、mod.requires
配列をループする必要があります。
モジュールにモジュール レベルの依存関係がある場合は、次のようになります。
var mod = angular.module('myModule', ['otherModule1','otherModule2']);
次に、mod
オブジェクトにはmod.requires
、次のように、それらのモジュールの依存関係の名前を含む配列も含まれます。
angular.forEach(mod.requires, function(requiredModuleName){
// first get a reference to the required module by calling angular.module()
var requiredMod = angular.module(requiredModuleName);
// requiredMod will have its own ._invokeQueue
// requiredMod._invokeQueue will look like the _invokeQueue from above
...
// do something with the additional providers in _invokeQueue
});
それが役立つことを願っています。
これを試して:
angular.module('MyApp')['_invokeQueue'].forEach(function(value){
console.log(value[1] + ": " + value[2][0]);
})
ほとんどのサービスを利用する方法は次のとおりです
すなわち:定数、値、工場、サービス。
function allServices(mod, r) {
var inj = angular.element(document).injector().get;
if (!r) r = {};
angular.forEach(angular.module(mod).requires, function(m) {allServices(m,r)});
angular.forEach(angular.module(mod)._invokeQueue, function(a) {
try { r[a[2][0]] = inj(a[2][0]); } catch (e) {}
});
return r;
};
allMyServices = allServices('myApp');
コンソールに入力するとallMyServices.
、それらのオートコンプリート リストが表示されます。
上記の関数は、angular.element(document).injector()
未定義を返す特定の状況で失敗する可能性があります。代わりに以下の関数を使用できます...
別の方法
var inj;
function allServices(mod, r) {
if (!r) {
r = {};
inj = angular.element(document.querySelector('[ng-app]')).injector().get;
}
angular.forEach(angular.module(mod).requires, function(m) {allServices(m,r)});
angular.forEach(angular.module(mod)._invokeQueue, function(a) {
try { r[a[2][0]] = inj(a[2][0]); } catch (e) {}
});
return r;
};
allMyServices = allServices('myApp');
コンソールに入力するとallMyServices.
、それらのオートコンプリート リストが表示されます。