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

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

62
задан 14 February 2018 в 19:21

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

Hope, которая помогает.

63
ответ дан 31 October 2019 в 13:47

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

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

0
ответ дан 31 October 2019 в 13:47

Попробуйте это:

angular.module('MyApp')['_invokeQueue'].forEach(function(value){ 
    console.log(value[1] + ": " + value[2][0]);
})
36
ответ дан 31 October 2019 в 13:47

Вот то, как можно получить большинство сервисов

Т.е.: константы , значения , фабрики , сервисы .

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

30
ответ дан 31 October 2019 в 13:47

Другие вопросы по тегам:

Похожие вопросы: