错误:参数不是函数,未定义
Posted
技术标签:
【中文标题】错误:参数不是函数,未定义【英文标题】:Error: Argument is not a function, got undefined 【发布时间】:2013-06-21 18:31:51 【问题描述】:在 Scala Play 中使用 AngularJS,我收到了这个错误。
错误:参数“MainCtrl”不是函数,未定义
我正在尝试创建一个包含星期几的表格。
请看一下我的代码。我检查了控制器的名称,但这似乎是正确的。注意:此 SO answer
中使用的代码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"]
);
());
【问题讨论】:
在你用过ng-app
的html里能不能改成ng-app=myApp
遇到同样的错误@Chandermani
您是否尝试过从代码中删除闭包(IIFE)?当我遇到这个问题时,是因为我的 javascript 中有一个 php 错误。
你可以通过这个清单找出你的问题:***.com/a/26797874/930170
确认是否在BundleConfig.cs文件中添加MainCtrl.controller.js
【参考方案1】:
似乎有许多可行的解决方案表明错误有许多实际原因。
就我而言,我没有在 app/index.html
中声明控制器:
<scipt src="src/controllers/controller-name.controller.js"></script>
错误消失了。
【讨论】:
【参考方案2】:因为在尝试查找以下问题的答案时会在 Google 中弹出此消息:“错误:参数 '' 不是函数,未定义”。
您可能会尝试两次创建同一个模块。
angular.module 是一个用于创建、注册和 检索 AngularJS 模块。
传递一个参数会检索一个现有的 angular.Module,而 传递多个参数会创建一个新的 angular.Module
来源:https://docs.angularjs.org/api/ng/function/angular.module#overview
例子:
angular.module('myApp', [])
用于创建模块而不注入任何依赖项。
angular.module('myApp')
(无参数)用于获取现有模块。
【讨论】:
【参考方案3】:原来是浏览器的缓存,在这里使用Chrome。只需检查 Inspect (Element) 下的“禁用缓存”即可解决我的问题。
【讨论】:
【参考方案4】:就我而言,这是index.html
中的一个简单错字:
<script src="assets/javascript/controllers/questionssIndexController.js"></script>
应该是这样的
<script src="assets/javascript/controllers/questionsIndexController.js"></script>
控制器名称中没有额外的s
。
【讨论】:
【参考方案5】:为了解决这个问题,我不得不发现我在 Angular 路由的声明中拼错了控制器的名称:
.when('/todo',
templateUrl: 'partials/todo.html',
controller: 'TodoCtrl'
)
【讨论】:
【参考方案6】:如果您在子模块中,请不要忘记在主应用程序中声明该模块。 即:
<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" 不是一个函数,没有定义。
【讨论】:
【参考方案7】:是否可以像将您的资产包含在“”中一样简单,并且任何需要在内部用 ' ' 引用的内容?
<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
变成
<link rel="stylesheet" media="screen" href="@routes.Assets.at('stylesheets/main.css')">
这可能会导致一些解析问题
【讨论】:
【参考方案8】:这严重地花了我 4 小时(包括对 SO 的无休止搜索),但最终我找到了它:我不小心(无意地)在某处添加了一个空格。
你能认出来吗?
angular.module('bwshopper.signup').controller('SignupCtrl ', SignupCtrl);
所以... 4 小时后我看到它应该是:
angular.module('bwshopper.signup').controller('SignupCtrl', SignupCtrl);
肉眼几乎看不到。
这强调了修订控制(git 或其他)和单元/回归测试的重要性。
【讨论】:
我的答案不是多余的空间,但它引导我解决问题。我有Controller
而不是controller
,这就是全部。
我将文件命名为 options-moda.controller.js 但正在寻找 options-modal.controller.js DOH!
我的是因为我忘记在 BundleConfig 中添加 .js。简单但令人沮丧。【参考方案9】:
我犯了同样的错误,犯了一个大错误:
appFormid.controller('TreeEditStepControlsCtrl', [$scope, function($scope)
]);
你看到了吗?我忘记了第一个 $scope 周围的 '',正确的语法当然是:
appFormid.controller('TreeEditStepControlsCtrl', ['$scope', function($scope)
]);
我没有立即看到的第一个错误是:“$scope 未定义”,然后是“错误:[ng:areq] 参数“TreeEditStepControlsCtrl”不是函数, 未定义"
【讨论】:
【参考方案10】:从模块名称 ([myApp]) 中删除 []
angular.module('myApp', [])
并将ng-app="myApp"
添加到 html 中,它应该可以工作。
【讨论】:
我所要做的就是第二个建议(即设置 ng-app="myApp")。如果我删除了 [],则会出现另一个错误。 有第二个参数[]
表示您正在创建一个新模块。删除第二个参数表示您正在检索现有模块。因此,检查的一种可能性是您是否两次调用angular.module
,两次都包括第二个参数。如果是这样,后面的事件将覆盖第二个,隐藏该点之前的所有控制器定义。
当他说要删除[]
时,他指的是OP 具有[myApp]
而不是myApp
的第一个参数。他说的不是第二个参数。
如果您使用路由,请检查控制器的名称。路由定义中的控制器名称区分大小写。【参考方案11】:
在我的情况下(有一个概览页面和一个“添加”页面),我通过如下的路由设置得到了这个。它正在为无法注入的 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('/'
路由,我的所有路由都进入了概览,并且控制器无法在/add 路由页面渲染上匹配。这很令人困惑,因为我确实看到了 add.html 模板,但找不到它的控制器。
当案例为我解决此问题时删除“/”路由。
【讨论】:
我也收到了这个错误,并且因为它导致我的 TFS 构建失败而扯掉了我的头发。注释掉“/”路线也为我修复了它。现在找出原因!【参考方案12】:有时此错误是由 html 中指定的 两个 ng-app
指令引起的。
在我的情况下,我错误地在html
标签中指定了ng-app
,在body
标签中指定了ng-app="myApp"
,如下所示:
<html ng-app>
<body ng-app="myApp"></body>
</html>
【讨论】:
当我没有将注入添加到 myApp 模块时发生在我身上。 谢谢!这解决了我的问题。【参考方案13】:我在主 index.html 中使用的 LoginController 出现了正常错误。 我找到了两种解决方法:
设置 $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']);
【讨论】:
【参考方案14】:Уmed 的第二点是我的陷阱,但只是为了记录,也许它正在帮助某个地方的人:
我遇到了同样的问题,就在我发疯之前,我发现我忘记了包含我的控制器脚本。
由于我的应用基于 ASP.Net MVC,我决定通过在我的 App_Start/BundleConfig.cs
中插入以下 sn-p 来保持理智bundles.Add(new ScriptBundle("~/app").Include(
"~/app/app.js",
"~/app/controllers/*.js",
"~/app/services/*.js" ));
在Layout.cshtml
中<head>
...
@Scripts.Render("~/app")
...
</head>
现在我不必再考虑手动添加文件了。 事后看来,我真的应该在设置项目时这样做......
【讨论】:
【参考方案15】:我遇到了同样的问题,就我而言,这是由于这个问题而发生的:
我将控制器定义在一个单独的模块(称为“myApp.controllers”)中并注入到主应用程序模块(称为“myApp”)中,如下所示:
angular.module('myApp', ['myApp.controllers'])
一位同事将另一个控制器模块推送到一个单独的文件中,但与我的名称完全相同(即 'myApp.controllers' ),这导致了此错误。我认为是因为 Angular 在这些控制器模块之间感到困惑。但是,错误消息对于发现问题所在并没有多大帮助。
【讨论】:
这应该通过删除模块中的第二个参数来解决...使用没有第二个参数的 angular.module('myApp') 获取现有模块。即 angular.module('myApp').contoller(...)【参考方案16】:第一。
检查路由定义中是否有正确的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>
【讨论】:
根据我的经验,您的“第二”始终是问题所在。我经常忘记将控制器导入index.html
我的也是第二个,忘记导入js文件了...【参考方案17】:
我收到了同样的错误信息(在我的例子中:“Argument 'languageSelectorCtrl' is not a function, got 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'])
这失败了。
当我添加缺少的参考时:
angular.module('MyApp', ['MyApp.filters', 'MyApp.services', 'MyApp.controllers', 'MyApp.directives'])
错误消息消失了,Angular 可以再次实例化控制器。
【讨论】:
有同样的问题,我的问题是我忘记将我的控制器添加到应用程序模块......为什么这不会自动发生???无论如何谢谢!以上是关于错误:参数不是函数,未定义的主要内容,如果未能解决你的问题,请参考以下文章
AngularJS:参数'Controller as short'不是函数,未定义