控制器不是一个函数,没有定义,而全球定义控制器

我正在写一个使用angularjs的示例应用程序。 我在Chrome浏览器中遇到下面提到的错误。

错误是

错误:[ng:areq] http://errors.angularjs.org/1.3.0-beta.17/ng/areq?p0=ContactController&p1=not%20a%20function%2C%20got%20undefined

呈现为

参数'ContactController'不是一个函数,没有定义

<!DOCTYPE html> <html ng-app> <head> <script src="../angular.min.js"></script> <script type="text/javascript"> function ContactController($scope) { $scope.contacts = ["abcd@gmail.com", "abcd@yahoo.co.in"]; $scope.add = function() { $scope.contacts.push($scope.newcontact); $scope.newcontact = ""; }; } </script> </head> <body> <h1> modules sample </h1> <div ng-controller="ContactController"> Email:<input type="text" ng-model="newcontact"> <button ng-click="add()">Add</button> <h2> Contacts </h2> <ul> <li ng-repeat="contact in contacts"> {{contact}} </li> </ul> </div> </body> </html> 

使用Angular 1.3+,您不能再在全局范围内使用全局控制器声明(没有显式注册)。 您需要使用module.controller语法注册控制器。

例:-

 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 = ""; }; }]); 

要么

 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); 

这是一个突破性的改变,但可以通过使用allowGlobalsclosures使用全局variables 。

例:-

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

以下是来自Angular的评论:

  • 检查具有给定名称的控制器是否通过$controllerProvider注册
  • 检查评估当前范围的string是否返回构造函数
  • 如果$ controllerProvider#allowGlobals,在全局window对象上检查window[constructor] (不推荐)
  ..... expression = controllers.hasOwnProperty(constructor) ? controllers[constructor] : getter(locals.$scope, constructor, true) || (globals ? getter($window, constructor, true) : undefined); 

一些额外的检查: –

  • 请确保将angular色根元素(例如: – html )中ng-app放在ng-app指令中。 例如: – ng-app =“myApp”

  • 如果一切正常,但仍然遇到问题,请记住确保脚本中包含正确的文件。

  • 你还没有在不同的地方定义两次相同的模块,导致在同一模块中定义的任何实体被清除,例如angular.module('app',[]).controller(.. angular.module('app',[]).service(.. (包括两个脚本当然包括在内)都可以导致模块app上先前注册的控制器被第二次重新创build模块清除。

我得到了这个问题,因为我已经封闭了一个控制器定义文件:

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

但是我忘记了实际调用这个闭包来执行这个定义代码,并且实际上告诉了我的控制器存在。 即,以上需要是:

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

注意()在最后。

我是Angular的初学者,我做了一个基本的错误,那就是没有在angular根元素中包含应用程序名称。 所以,改变代码

 <html data-ng-app> 

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

为我工作。 @PSL,在他的回答中已经涵盖了这个。

我有这个错误,因为我不明白angular.module('myApp', [])angular.module('myApp')之间的区别。

这将创build模块“myApp”并覆盖任何现有的名为“myApp”的模块:

angular.module('myApp', [])

这将检索一个现有的模块“myApp”:

angular.module('myApp')

我已经覆盖我的模块在另一个文件,使用上面创build另一个模块,而不是像我所期望的检索上面的第一个电话。

更多细节在这里: https : //docs.angularjs.org/guide/module

我只是迁移到angular1.3.3,我发现,如果我有多个控制器在不同的文件时,应用程序被覆盖,我失去了第一个声明的容器。

我不知道是不是一个好的做法,但也许可以帮助另一个。

 var app = app; if(!app) { app = angular.module('web', ['ui.bootstrap']); } app.controller('SearchCtrl', SearchCtrl); 

当我不小心重新myApp时,我遇到了这个问题:

 var myApp = angular.module('myApp',[...]); myApp.controller('Controller1', ...); var myApp = angular.module('myApp',[...]); myApp.controller('Controller2', ...); 

重新声明之后, Controller1停止工作并引发OP错误。

当您拥有一个包含很多模块的大型项目时,也可能会发生此错误。 确保angular度文件中使用的应用程序(模块)与您在模板中使用的相同,在本例中为“ thisApp ”。

app.js

 angular .module('thisApp', []) .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 = ""; }; }]); 

的index.html

  <html> <body ng-app='thisApp' ng-controller='ContactController> ... <script type="text/javascript" src="assets/js/angular.js"></script> <script src="app.js"></script> </body> </html> 

如果你正在使用路由(高概率),并且你的configuration有一个模块中没有声明为依赖的控制器的引用,那么初始化也可能失败。

例如,假设你已经为你的应用configuration了ngRoute,比如

 angular.module('yourModule',['ngRoute']) .config(function($routeProvider, $httpProvider) { ... }); 

在声明路由的块中要小心,

 .when('/resourcePath', { templateUrl: 'resource.html', controller: 'secondModuleController' //lives in secondModule }); 

在'ngRoute'应该解决问题之后,声明secondModule作为依赖项。 我知道我有这个问题。

真的很好的build议,除了同样的错误可以简单地通过缺less包含在你的根页面的关键脚本

例:

页面:index.html

  np-app="saleApp" 

失踪

 <script src="./ordersController.js"></script> 

当路线被告知什么控制器和视图提供服务:

  .when('/orders/:customerId', { controller: 'OrdersController', templateUrl: 'views/orders.html' }) 

所以,这个未定义的控制器问题可能发生在这个偶然的错误中,甚至不参考控制器!

我得到这个错误,因为我正在使用与我的代码不兼容的旧版本的angular度。

如果一切都失败了,你正在使用Gulp或类似的东西…只是重新运行它!

我浪费了30分钟四重检查所有需要的东西,只是一个快速的踢在裤子。

在使用AngularJS 1.4.3(不够老)的老教程时,我得到了同样的错误。 到目前为止,最简单的解决scheme是编辑angular.js源文件

 function $ControllerProvider() { var controllers = {}, globals = false; 

 function $ControllerProvider() { var controllers = {}, globals = true; 

只需按照教程进行操作即可,而不推荐使用的全局函数只能用作控制器。