2012-09-22 11 views
11

In angularjs prüfen Sie bei einem Modul, ob bei einem Modul eine Direktive/ein Controller existiert.So prüfen Sie, ob eine Richtlinie oder ein Controller in einem Modul mit Angularjs verfügbar ist

Ich habe ein Modul, und ich möchte wissen, ob einige bestimmte Direktiven geladen wurden. Unten ist ein Beispielcode:

var module = angular.module('myModule'); 
//check if controller exists 
if (module.hasController('my.first.controller')){ 
    //do something 
} 
if (module.hasDirective('my.first.directive')){ 
    //do something 
} 

Ich habe dies in einer Weise implementiert. Auf der Suche nach einem besseren Weg, wenn es standardmäßig verfügbar ist.

Ist das möglich? Wenn ja, wie machst du das?

+0

Möchten Sie diese Controller/Direktiven während der Konfigurationsphase des Moduls herausfinden? Oder nachdem eine Anwendung bootstrapped wurde (run()) Phase wurde ausgeführt)? –

+0

Jeder wird für mich tun. In jedem Fall, bevor ich die Prüfung mache, wäre die Anwendung mit angular.bootstrap(el,[myModule]) ritcoder

Antwort

9

Verwenden Sie diesen Code, um zu prüfen, ob ein Service vorhanden ist.

$injector.has('myServiceName')

Um zu überprüfen, ob eine Richtlinie vorhanden ist, können Sie eine Directive Suffix nach der Richtlinie Namen hinzufügen:

$injector.has('myDirectiveNameDirective')

-3

Das Problem wurde gelöst, indem eine Wrapper-Funktion geschrieben wurde, die aufgerufen wird, um die Controller und andere Sachen zu laden, und bei denen ich feststellen kann, wann jede Anweisung geladen ist.

+11

bootstrapped worden. Könnten Sie diesen Code teilen? – CMCDragonkai

3

Ich fand einige Arbeitscode here

angular.service('ControllerChecker', ['$controller', function($controller) { 
    return { 
     exists: function(controllerName) { 
      if(typeof window[controllerName] == 'function') { 
       return true; 
      } 
      try { 
       $controller(controllerName); 
       return true; 
      } catch (error) { 
       return !(error instanceof TypeError); 
      } 
     } 
    }; 
}]); 

JSFiddle : http://jsfiddle.net/fracz/HB7LU/6780/

2
var controllers = []; 

    _.each(app._invokeQueue, function(value, index) { 
     if (value[0] !== '$controllerProvider') { 
      return; 
     } 

     controllers.push(value[2][0]); 
    }); 

    if (controllers.indexOf('controller-i-want') === - 1) { 
     // controller is undefined 
    } 
Verwandte Themen