Я натолкнулся на эту ту же самую проблему на днях. У меня было несколько проблем с принятым в настоящее время ответ, а именно потому, что один из моих контроллеров выполнял вызов инициализации к серверу при конкретизации для заполнения некоторых данных (то есть):
function ExampleController($scope, ExampleService) {
ExampleService.getData().then(function(data) {
$scope.foo = data.foo;
$scope.bar = data.bar
});
}
Как можно заметить, в настоящее время принято ответ будет фактически создавать экземпляр контроллера, прежде чем отбрасывать его. Это приводит к появлению нескольких вызовов API по каждому запросу (один для проверки наличия контроллера, который фактически использует контроллер).
У меня было немного окунуться в $controller
source code и обнаружил, что есть недокументированный параметр, который вы можете передать в вызванном later
, который задерживает создание экземпляра. Тем не менее, он все равно проведет все проверки, чтобы гарантировать, что контроллер существует, что идеально!
angular.factory("util", [ "$controller", function($controller) {
return {
controllerExists: function(name) {
try {
// inject '$scope' as a dummy local variable
// and flag the $controller with 'later' to delay instantiation
$controller(name, { "$scope": {} }, true);
return true;
}
catch(ex) {
return false;
}
}
};
}]);
UPDATE: Возможно, намного проще, как декоратор:
angular.config(['$provide', function($provide) {
$provide.delegate('$controller', [ '$delegate', function($delegate) {
$delegate.exists = function(controllerName) {
try {
// inject '$scope' as a dummy local variable
// and flag the $controller with 'later' to delay instantiation
$delegate(controllerName, { '$scope': {} }, true);
return true;
}
catch(ex) {
return false;
}
};
return $delegate;
}]);
}]);
Тогда вы можете просто впрыснуть $controller
и называем exists(...)
function($controller) {
console.log($controller.exists('TestController') ? 'Exists' : 'Does not exist');
}
Просто любопытно, что нужно проверить, если контроллер зарегистрирован является. – dtabuenc
К сожалению, я не помню сейчас (почти год спустя). Я * думаю * Я, возможно, занимался разработкой проекта и хотел, чтобы интроспекция облегчала документацию. Я подтвердил ваш комментарий, потому что вы не просто предположили, что это было не так, как хотелось бы (я ненавижу это). –