diff --git a/docs/content/error/$controller/ctrlreg.ngdoc b/docs/content/error/$controller/ctrlreg.ngdoc new file mode 100644 index 000000000000..64a77d7abbca --- /dev/null +++ b/docs/content/error/$controller/ctrlreg.ngdoc @@ -0,0 +1,23 @@ +@ngdoc error +@name $controller:ctrlreg +@fullName A controller with this name is not registered. +@description + +This error occurs when the {@link ng.$controller `$controller()`} service is called +with a string that does not match any of the registered controllers. The controller service may have +been invoked directly, or indirectly, for example through the {@link ng.ngController `ngController`} directive, +or inside a {@link angular.Module#component component} / {@link angular.Module#directive directive} / +{@link ngRoute.$routeProvider#when route} definition (when using a string for the controller property). +Third-party modules can also instantiate controllers with the {@link ng.$controller `$controller()`} service. + +Causes for this error can be: + +1. Your reference to the controller has a typo. For example, in +the {@link ng.ngController `ngController`} directive attribute, in a {@link angular.Module#component component} +definition's controller property, or in the call to {@link ng.$controller `$controller()`}. +2. You have not registered the controller (neither via {@link angular.Module#controller `Module.controller`} +nor {@link ng.$controllerProvider#register `$controllerProvider.register()`}. +3. You have a typo in the *registered* controller name. + + +Please consult the {@link ng.$controller $controller} service api docs to learn more. diff --git a/docs/content/error/ng/areq.ngdoc b/docs/content/error/ng/areq.ngdoc index 376ac035c00a..ddf1d408520b 100644 --- a/docs/content/error/ng/areq.ngdoc +++ b/docs/content/error/ng/areq.ngdoc @@ -5,4 +5,5 @@ AngularJS often asserts that certain values will be present and truthy using a helper function. If the assertion fails, this error is thrown. To fix this problem, -make sure that the value the assertion expects is defined and truthy. +make sure that the value the assertion expects is defined and matches the type mentioned in the +error. diff --git a/src/ng/controller.js b/src/ng/controller.js index b1cbdc5cf91d..f6c4a7c5abd1 100644 --- a/src/ng/controller.js +++ b/src/ng/controller.js @@ -122,6 +122,11 @@ function $ControllerProvider() { : getter(locals.$scope, constructor, true) || (globals ? getter($window, constructor, true) : undefined); + if (!expression) { + throw $controllerMinErr('ctrlreg', + 'The controller with the name \'{0}\' is not registered.', constructor); + } + assertArgFn(expression, constructor, true); } diff --git a/test/ng/controllerSpec.js b/test/ng/controllerSpec.js index f872e42c3cb6..8fca250c9fba 100644 --- a/test/ng/controllerSpec.js +++ b/test/ng/controllerSpec.js @@ -161,6 +161,12 @@ describe('$controller', function() { }).toThrow(); })); + it('should throw ctrlreg when the controller name does not match a registered controller', function() { + expect(function() { + $controller('IDoNotExist', {$scope: {}}); + }).toThrowMinErr('$controller', 'ctrlreg', 'The controller with the name \'IDoNotExist\' is not registered.'); + }); + describe('ctrl as syntax', function() { @@ -227,7 +233,6 @@ describe('$controller', function() { 'Must match `__name__ as __id__` or `__name__`.'); }); - it('should allow identifiers containing `$`', function() { var scope = {}; diff --git a/test/ng/directive/ngControllerSpec.js b/test/ng/directive/ngControllerSpec.js index 89bd23f9c781..f78baa7fff7e 100644 --- a/test/ng/directive/ngControllerSpec.js +++ b/test/ng/directive/ngControllerSpec.js @@ -150,4 +150,5 @@ describe('ngController', function() { $httpBackend.flush(); expect(controllerScope.name).toBeUndefined(); })); + });