错误:参数不是一个函数,没有定义
使用AngularJS与Scala Play,我得到这个错误。
错误:参数'MainCtrl'不是一个函数,没有定义
我试图创build一个由一周的日子组成的表。
请看我的代码。 我已经检查了控制器的名称,但似乎是正确的。 注意:从这个SO 回答使用的代码
index.scala.html
@(message: String) @main("inTime") { <!doctype html> <html lang="en" ng-app> <head> <link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")"> </head> <div ng-controller="MainCtrl"> <table border="1"> <tbody ng-repeat='(what,items) in data'> <tr ng-repeat='item in items'> <td ngm-if="$first" rowspan="{{items.length}}">{{what}}</td> <td>{{item}}</td> </tr> </tbody> </table> </div> </html> }
MainCtrl.js
(function() { angular.module('[myApp]', []).controller('MainCtrl', function($scope) { $scope.data = { Colors: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"] } }); }());
从模块的名称([myApp])中删除[]
angular.module('myApp', [])
并添加ng-app="myApp"
到html,它应该工作。
第一。 检查路由定义中是否有正确的controller
,与您正在定义的控制器名称相同
communityMod.config(['$routeProvider', function($routeProvider) { $routeProvider. when('/members', { templateUrl: 'modules/community/views/members.html', controller: 'CommunityMembersCtrl' }). otherwise({ redirectTo: '/members' }); }]); communityMod.controller('CommunityMembersCtrl', ['$scope', function ($scope) { $scope.name = 'Hello community'; }]);
在这个例子中不同的控制器名称会导致错误,但是这个例子是正确的
SECOND检查你是否已经导入你的JavaScript文件:
<script src="modules/community/controllers/CommunityMembersCtrl.js"></script>
我有相同的错误消息(在我的情况:“参数'languageSelectorCtrl'不是一个函数,得到了undefined”)。
经过与Angular种子代码的单调乏味的比较之后,我发现我以前在app.js中删除了对控制器模块的引用。 (发现在https://github.com/angular/angular-seed/blob/master/app/js/app.js )
所以我有这个:
angular.module('MyApp', ['MyApp.filters', 'MyApp.services', 'MyApp.directives'])
这失败了。
而当我添加缺less的参考:
angular.module('MyApp', ['MyApp.filters', 'MyApp.services', 'MyApp.controllers', 'MyApp.directives'])
错误消息消失了,Angular可以再次实例化控制器。
有时候这个错误是由html中指定的两个 ng-app
指令造成的。 在我的错误情况下,我已经在我的html
标记中指定了ng-app
在html
标记中指定了ng-app
ng-app="myApp"
,如下所示:
<html ng-app> <body ng-app="myApp"></body> </html>
这真的花了我4小时(包括无休止的search),但最终我发现:错误地(无意),我增加了一个空间的地方。
你能发现吗?
angular.module('bwshopper.signup').controller('SignupCtrl ', SignupCtrl);
所以…… 4个小时后,我看到它应该是:
angular.module('bwshopper.signup').controller('SignupCtrl', SignupCtrl);
几乎不可能用肉眼看到。
这强调了修订控制(git或其他)和单元/回归testing的重要性。
我遇到了同样的问题,在我的情况下,这是由于这个问题:
我有一个单独的模块(称为“myApp.controllers”)中定义的控制器,并注入到主应用程序模块(称为“myApp”),如下所示:
angular.module('myApp', ['myApp.controllers'])
一位同事把另一个控制器模块放在一个单独的文件中,但是与我的名字完全相同(即'myApp.controllers')导致了这个错误。 我觉得因为Angular在这些控制器模块之间混淆了。 但是,这个错误信息对于发现哪里出错是没有什么帮助的。
在我的情况下(有一个概述页面和一个“添加”页面)我得到这个与我的路由设置如下。 这是给无法注入的AddCtrl消息…
$routeProvider. when('/', { redirectTo: '/overview' }). when('/overview', { templateUrl: 'partials/overview.html', controller: 'OverviewCtrl' }). when('/add', { templateUrl: 'partials/add.html', controller: 'AddCtrl' }). otherwise({ redirectTo: '/overview' });
由于when('/'
路由我的所有路由去概览和控制器不能匹配/添加路由页面呈现。这是令人困惑的,因为我DID看到add.html模板,但其控制器无处可去find。
删除“/” – 路线的情况下解决这个问题给我。
如果您位于子模块中,请不要忘记在主应用程序中声明该模块。 即:
<scrip> angular.module('mainApp', ['subModule1', 'subModule2']); angular.module('subModule1') .controller('MyController', ['$scope', function($scope) { $scope.moduleName = 'subModule1'; }]); </script> ... <div ng-app="mainApp"> <div ng-controller="MyController"> <span ng-bind="moduleName"></span> </div>
如果你没有在mainApp中声明subModule1,你会得到一个“[ng:areq]参数”MyController“不是一个函数,没有定义。
Уmed的第二点是我的陷阱,但只是为了logging,也许是帮助某个地方的人:
我有同样的问题,就在我疯了之前,我发现我忘了包含我的控制器脚本。
由于我的应用程序基于ASP.Net MVC,我决定通过在我的App_Start / BundleConfig.cs中插入以下代码片段来保持自己的理智
bundles.Add(new ScriptBundle("~/app").Include( "~/app/app.js", "~/app/controllers/*.js", "~/app/services/*.js" ));
和Layout.cshtml中
<head> ... @Scripts.Render("~/app") ... </head>
现在我不必再考虑手动包含这些文件了。 事后看来,我确实应该在build立项目时做到这一点。
我使用了主要的index.html中的LoginController, 我find了两种解决方法:
-
设置$ controllerProvider.allowGlobals(),我发现Angular change-list中的评论“这个选项可能适用于迁移旧应用程序,但是请不要在新的应用程序中使用它! 对Angular的原创评论
app.config(['$ controllerProvider',function($ controllerProvider){$ controllerProvider.allowGlobals();}]);
-
错误的注册控制器的构造者
之前
LoginController.$inject = ['$rootScope', '$scope', '$location'];
现在
app.controller('LoginController', ['$rootScope', '$scope', '$location', LoginController]);
'app'来自app.js
var MyApp = {}; var app = angular.module('MyApp ', ['app.services']); var services = angular.module('app.services', ['ngResource', 'ngCookies', 'ngAnimate', 'ngRoute']);
我犯了一个很大的错误:
appFormid.controller('TreeEditStepControlsCtrl', [$scope, function($scope){ }]);
你看 ? 我忘记了第一个$范围周围的“”,正确的语法当然是:
appFormid.controller('TreeEditStepControlsCtrl', ['$scope', function($scope){ }]);
第一个错误,我没有立即看到:“ $范围没有定义 ”,其次是“ 错误:[ng:areq]参数'TreeEditStepControlsCtrl'不是一个函数,得到了undefined ”
它可以像封闭你的资产一样简单,“”和任何需要在内部引用“”?
<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
变
<link rel="stylesheet" media="screen" href="@routes.Assets.at('stylesheets/main.css')">
这可能会导致一些parsing问题
为了解决这个问题,我不得不发现我在Angular路由的声明中拼错了控制器的名字:
.when('/todo',{ templateUrl: 'partials/todo.html', controller: 'TodoCtrl' })
原来这是浏览器的caching,在这里使用Chrome浏览器。 只需检查“禁用caching”下检查(元素)解决了我的问题。
在我的情况下,这是一个简单的错字在index.html
:
<script src="assets/javascript/controllers/questionssIndexController.js"></script>
应该是的
<script src="assets/javascript/controllers/questionsIndexController.js"></script>
没有额外s
控制器的名字。