Controller not a function, got undefined, while defining controllers globally Controller not a function, got undefined, while defining controllers globally javascript javascript

Controller not a function, got undefined, while defining controllers globally


With Angular 1.3+ you can no longer use global controller declaration on the global scope (Without explicit registration). You would need to register the controller using module.controller syntax.

Example:-

angular.module('app', [])    .controller('ContactController', ['$scope', function ContactController($scope) {        $scope.contacts = ["abcd@gmail.com", "abcd@yahoo.co.in"];        $scope.add = function() {            $scope.contacts.push($scope.newcontact);            $scope.newcontact = "";        };    }]);

or

function ContactController($scope) {    $scope.contacts = ["abcd@gmail.com", "abcd@yahoo.co.in"];    $scope.add = function() {        $scope.contacts.push($scope.newcontact);        $scope.newcontact = "";    };}ContactController.$inject = ['$scope'];angular.module('app', []).controller('ContactController', ContactController);

It is a breaking change but it can be turned off to use globals by using allowGlobals.

Example:-

angular.module('app')    .config(['$controllerProvider', function($controllerProvider) {        $controllerProvider.allowGlobals();    }]);

Here is the comment from Angular source:-

  • check if a controller with given name is registered via $controllerProvider
  • check if evaluating the string on the current scope returns a constructor
  • if $controllerProvider#allowGlobals, check window[constructor] on the global window object (not recommended)
 .....expression = controllers.hasOwnProperty(constructor)            ? controllers[constructor]            : getter(locals.$scope, constructor, true) ||                (globals ? getter($window, constructor, true) : undefined);

Some additional checks:-

  • Do Make sure to put the appname in ng-app directive on your angular root element (eg:- html) as well. Example:- ng-app="myApp"

  • If everything is fine and you are still getting the issue do remember to make sure you have the right file included in the scripts.

  • You have not defined the same module twice in different places which results in any entities defined previously on the same module to be cleared out, Example angular.module('app',[]).controller(.. and again in another place angular.module('app',[]).service(.. (with both the scripts included of course) can cause the previously registered controller on the module app to be cleared out with the second recreation of module.


I got this problem because I had wrapped a controller-definition file in a closure:

(function() {   ...stuff...});

But I had forgotten to actually invoke that closure to execute that definition code and actually tell Javascript my controller existed. I.e., the above needs to be:

(function() {   ...stuff...})();

Note the () at the end.


I am a beginner with Angular and I did the basic mistake of not including the app name in the angular root element. So, changing the code from

<html data-ng-app> 

to

<html data-ng-app="myApp"> 

worked for me. @PSL, has covered this already in his answer above.