前几天我遇到了同样的问题。我对当前接受的答案有一些问题,即因为我的一个控制器在实例化时正在对服务器执行初始化调用以填充一些数据(即):
function ExampleController($scope, ExampleService) {
ExampleService.getData().then(function(data) {
$scope.foo = data.foo;
$scope.bar = data.bar
});
}
就目前而言,当前接受的答案实际上会在丢弃控制器之前实例化控制器。这导致对每个请求进行多个 API 调用(一个用于验证控制器是否存在,一个用于实际使用控制器)。
我在$controller
源代码中进行了一些挖掘 ,发现有一个未记录的参数可以传入调用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;
}
}
};
}]);
更新:作为装饰者可能要容易得多:
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');
}