2016-08-23 10 views
9

Czy można uzyskać listę wszystkich kontrolerów kątowych, które zdefiniowałem? Zasadniczo chcę móc określić, który z nich muszę zaimportować (te, które napisałem) w zależności od tego, które z nich są używane. Jedyny sposób, jaki mogę wymyślić, to przejść przez HTML i znaleźć wszystkie wartości związane z ng-controller, ale zastanawiałem się, czy istnieje czystszy, bardziej niezawodny sposób.Uzyskaj wszystkie kontrolery Angulara

+0

Cieszę się, że nie skorzystałeś z oryginalnego pomysłu, ponieważ ... Jeśli przechodzisz przez HTML, nie znajdziesz żadnych kontrolerów, jeśli ludzie używają ** ui-router ** i 'controllerAs '. – byxor

+0

@BrandonIbbotson To bardziej wewnętrzne rozwiązanie, a wszystkie kontrolery używają 'ng-kontrolera', więc nie byłoby to zbyt dużym problemem. Jestem świadomy "ui-routera", ale nie jest to do tego wykorzystywane. Jakieś sugestie? –

+0

'ngRoute' pozwala również zdefiniować kontroler dla określonego html w plikach konfiguracyjnych js. – nubinub

Odpowiedz

1

spróbuje użyć _invokeQueue To może być to, czego szukasz:

angular.module('MyApp')['_invokeQueue'].forEach(function(val‌​ue){ console.log(value[2][0]) }) 

_invokeQueue jest wypełniona każdej usługi, która jest dodawana do modułu za pomocą znanego angular.module ("mymodule ') .controller, angular.module (' myModule '). directive i in. połączenia. Każda pozycja w kolejce jest tablicą z trzema elementami. Pierwszy to dostawca, który wywoła usługę , drugi to metoda na dostawcy do użycia , a trzeci element jest tablicą wszystkich argumentów przekazanych do usługi .

Reference

1

Można to zrobić za pomocą właściwości modułu _invokeQueue jak pokazano na this example

var appModule = angular.module('plunker',[]); 

angular.module('plunker').controller('TestCtrl', function(){}); 
angular.module('plunker').controller('TestCtrl2', function(){}); 
angular.module('plunker').controller('MainCtrl', function($scope) { 
    $scope.controllers = appModule._invokeQueue.filter(function(el){ 
     return el[0] === "$controllerProvider"; 
    }).map(function(el){ 
     return el[2]["0"]; 
    }); 
}); 
1

w którymkolwiek z istniejącego sterownika, skopiuj i wklej poniższy kod będzie wyświetla listę wszystkich kontrolerów.

Uwaga: Zmodyfikuj zmienną aplikacji za pomocą "aplikacji".

var app = angular.module('myApp',[]); 

angular.element(document).ready(function(){ 
     var values = app._invokeQueue; 
     angular.forEach(values, function(value, key) { 
      if(value[0] == '$controllerProvider'){ 
       console.log(value[2][0]); 
      } 
     }); 
    }); 
Powiązane problemy