65

登録されているすべてのディレクティブ、サービス、コントローラーなどのリストを実行時に取得できますか? . . ?

4

4 に答える 4

65

各モジュールのプロバイダー (サービス/ディレクティブ/コントローラー/ファクトリーなど) のリストを取得できますが、リストはわかりにくいものです。

次のものがあるとします。

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
});

それが役立つことを願っています。

于 2013-10-16T19:34:36.940 に答える
42

これを試して:

angular.module('MyApp')['_invokeQueue'].forEach(function(value){ 
    console.log(value[1] + ": " + value[2][0]);
})
于 2014-12-17T20:06:36.567 に答える
31

ほとんどのサービスを利用する方法は次のとおりです

すなわち:定数工場サービス

    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.、それらのオートコンプリート リストが表示されます。


注: どちらの方法でも、必ずモジュール名に置き換え'MyApp'てください。

于 2014-07-12T08:28:43.433 に答える