programing

AngularJS-등록 된 모든 서비스 목록을 얻으시겠습니까?

nasanasas 2020. 11. 27. 08:10
반응형

AngularJS-등록 된 모든 서비스 목록을 얻으시겠습니까?


나는 등 등록 된 모든 지침, 서비스, 컨트롤러의 목록을받을 수 런타임을 . . . ?


비록 그 목록이 다소 모호하지만 각 모듈에 대한 공급자 목록 (예 : 서비스 / 지침 / 컨트롤러 / 팩토리 / 기타)을 얻을 수 있습니다.

다음이 있다고 가정합니다.

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()는 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'합니다 .


I've created a GitHub gist with some code that can output the dependencies in a Graphviz friendly format. Which means you should be able to visualize the dependency graph.

See https://gist.github.com/dlidstrom/a2f787cef41ea4fcb8aa74d459f49270.

참고URL : https://stackoverflow.com/questions/19411502/angularjs-get-list-of-all-registered-services

반응형