错误:参数不是一个函数,没有定义

使用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-apphtml标记中指定了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了两种解决方法:

  1. 设置$ controllerProvider.allowGlobals(),我发现Angular change-list中的评论“这个选项可能适用于迁移旧应用程序,但是请不要在新的应用程序中使用它! 对Angular的原创评论

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

  2. 错误的注册控制器的构造者

之前

 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控制器的名字。