控制器不是一个函数,在全局定义控制器时未定义
Controller not a function, got undefined, while defining controllers globally
我正在使用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'不是一个函数,得到undefined
<!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
来关闭使用全局变量。
: -
angular.module('app')
.config(['$controllerProvider', function($controllerProvider) {
$controllerProvider.allowGlobals();
}]);
下面是Angular源代码中的注释:-
- 检查给定名称的控制器是否通过
注册$controllerProvider
- 检查在当前作用域中对字符串求值是否返回构造函数
- 如果$controllerProvider#allowGlobals,检查全局
window
对象上的window[constructor]
(不推荐)
.....
expression = controllers.hasOwnProperty(constructor)
? controllers[constructor]
: getter(locals.$scope, constructor, true) ||
(globals ? getter($window, constructor, true) : undefined);
一些附加检查:-
确保把appname在
ng-app
指令在你的角根元素(例如:-html
),以及。例子:- ng-app ="myApp"如果一切正常,你仍然得到这个问题,请记住确保你有正确的文件包含在脚本中
您没有在不同的地方定义相同的模块两次,导致之前在同一模块上定义的任何实体被清除,示例
angular.module('app',[]).controller(..
和再次在另一个地方angular.module('app',[]).service(..
(当然包括两个脚本)可以导致模块app
上先前注册的控制器被清除与第二次重建模块。
我得到了这个问题,因为我在闭包中包装了一个控制器定义文件:
(function() {
...stuff...
});
但是我忘记调用闭包来执行定义代码并告诉Javascript我的控制器存在。也就是说,上面的代码应该是:
(function() {
...stuff...
})();
注意末尾的()。
我是一个Angular的初学者,我犯了一个基本的错误,没有在Angular的根元素中包含应用的名称。因此,从
更改代码<html data-ng-app>
<html data-ng-app="myApp">
对我有用。@PSL在上面的回答中已经提到了这一点。
我有这个错误,因为我不理解angular.module('myApp', [])
和angular.module('myApp')
之间的区别。
这个创建模块'myApp'并覆盖任何现有的名为'myApp'的模块:
angular.module('myApp', [])
这个检索一个已存在的模块'myApp':
angular.module('myApp')
我在另一个文件中覆盖了我的模块,使用上面的第一个调用创建了另一个模块,而不是像我期望的那样检索。
更多的细节在这里:https://docs.angularjs.org/guide/module
我只是迁移到angular 1.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错误。
非常好的建议,除了SAME错误可能仅仅因为缺少根页面上的关键脚本
的例子:
page: index.html
np-app="saleApp"
失踪<script src="./ordersController.js"></script>
当一个Route被告知要提供什么控制器和视图时:
.when('/orders/:customerId', {
controller: 'OrdersController',
templateUrl: 'views/orders.html'
})
如此重要的未定义控制器问题可能发生在这个意外的错误,甚至没有引用控制器!
当您有一个包含许多模块的大型项目时,也可能发生此错误。确保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>
如果所有这些都失败了,你正在使用Gulp或类似的东西…重新运行它!
我浪费了30分钟反复检查每件事,而所需要的只是在裤子上踢一脚。
如果你正在使用路由(大概率),并且你的配置中有一个未声明为依赖的模块中的控制器的引用,那么初始化也可能失败。
E。假设你已经为你的应用配置了ngRoute,比如
angular.module('yourModule',['ngRoute'])
.config(function($routeProvider, $httpProvider) { ... });
在声明路由的块中要小心,
.when('/resourcePath', {
templateUrl: 'resource.html',
controller: 'secondModuleController' //lives in secondModule
});
在'ngRoute'之后声明secondModule
为依赖项应该可以解决这个问题。我知道我有这个问题。
我得到这个错误是因为我使用的是与我的代码不兼容的旧版本的angular。
在我的例子中,这些错误发生在list.find()函数的语法错误之前;IE11无法识别列表的"find"方法,因此必须用Filter方法替换,该方法适用于IE11和chrome。参考https://github.com/flrs/visavail/issues/19
这个错误,在我的情况下,在IE11中查找列表方法的语法错误之前。按照建议将find方法替换为filter方法https://github.com/flrs/visavail/issues/19
则上述控制器未定义错误解决。
我在使用(不够老的)AngularJS 1.4.3的旧教程时遇到了同样的错误。到目前为止,最简单的解决方案是在
中编辑angular.js sourcefunction $ControllerProvider() {
var controllers = {},
globals = false;
function $ControllerProvider() {
var controllers = {},
globals = true;
- 修改控制器AngularJS的全局值
- 从全局函数调用Ember控制器上的方法
- 如何从jQuery设置控制器或全局变量的属性
- 我可以在不注入控制器的情况下在 Angular 中使用全局常量吗?
- 如何在angularJS中的全局名称映射上确定控制器
- 访问一个控制器的ng隐藏值以在全局控制器中操纵另一个控制器中的ng样式
- 将全局变量从控制器调用到HTML视图AngularJS
- 我需要做什么才能访问控制器中的全局数据
- NodeJS与AngularJS,所需的HTML文件不是跨控制器的数据绑定全局变量
- 如何使用函数将值更改为作用域中的全局变量?(“控制器”)
- 在没有全局控制器的情况下从外部事件更新Ember.js数据
- "控制器污染全局命名空间“;它在Angular中意味着什么
- 控制器不是一个函数,在全局定义控制器时未定义
- 将服务数据保存到控制器的全局变量中
- 用CanJS为文档上触发的事件设置一个全局监听器/控制器
- 定义AngularJS工厂和控制器可以访问的全局函数和属性
- declare和use strict有什么区别吗?在一个全局匿名函数或内部控制器?在AngularJs
- 如何将全局异步数据存储/通信到控制器
- 角度控制器全局与闭合
- Ionic/Angularjs 将控制器更改为全局变量