Подтвердить что ты не робот

Angular - Получить список всех зарегистрированных сервисов?

Могу ли я получить список всех зарегистрированных директив, служб, контроллеров и т.д. во время выполнения.,

4b9b3361

Ответ 1

Вы можете получить список поставщиков (например, службы/директивы/контроллеры/фабрики/и т.д.) для каждого модуля, хотя список является довольно загадочным.

Скажите, что у вас есть следующее:

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

Надеюсь, что это поможет.

Ответ 2

Попробуйте следующее:

angular.module('MyApp')['_invokeQueue'].forEach(function(value){ 
    console.log(value[1] + ": " + value[2][0]);
})

Ответ 3

Здесь вы можете получить большинство сервисов

Ie: константы, значения, фабрики, службы.

    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() возвращает undefined. Вы можете использовать функцию ниже...


Альтернативный метод

    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' на имя модуля.

Ответ 4

Я создал GitHub gist с некоторым кодом, который может выводить зависимости в Graphviz дружественный формат. Это означает, что вы должны иметь возможность визуализировать график зависимостей.

См. https://gist.github.com/dlidstrom/a2f787cef41ea4fcb8aa74d459f49270.