Как проверить, доступна ли директива или контроллер в модуле с помощью Angularjs

В angularjs, заданном модулем, как вы проверяете, существует ли директива/контроллер с помощью модуля.

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

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
}

Я реализовал это в некотором роде. Ищите лучший способ сделать это, если он доступен по умолчанию.

Возможно ли это? Если да, как вы это делаете?

Ответ 1

Используйте этот код, чтобы проверить, существует ли служба.

$injector.has('myServiceName')

Чтобы проверить, существует ли директива, вы должны добавить суффикс Directive после имени директивы:

$injector.has('myDirectiveNameDirective')

Ответ 2

Я нашел некоторый рабочий код здесь

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/

Ответ 3

    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
    }

Ответ 4

Решила проблему, написав функцию-оболочку, которая вызывается для загрузки контроллеров и т.д., и при этом я могу сказать, когда загружается каждая директива.