控制器不是一个函数,没有定义,而全球定义控制器
我正在写一个使用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);
这是一个突破性的改变,但可以通过使用allowGlobals
closures使用全局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;
只需按照教程进行操作即可,而不推荐使用的全局函数只能用作控制器。