错误: 参数不是函数,未定义

在 Scala Play 中使用 AngularJS 时,我得到了这个错误。

错误: 参数“ MainCtrl”不是函数,未定义

我正在尝试创建一个由一周中的天数组成的表格。

请看一下我的代码。我检查了控制器的名称,但似乎是正确的。注意: 此 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"]
}
});
}());
212787 次浏览

从模块的名称([ myApp ])中删除 []

angular.module('myApp', [])

然后将 ng-app="myApp"添加到 html 中,应该就可以了。

我得到了相同的错误消息(在我的例子中: “ Argument‘ lingageSelectorCtrl’不是函数,没有定义”)。

在与 Angular Seeds 的代码进行了一些乏味的比较之后,我发现我之前已经删除了 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 可以再次实例化控制器。

首先。 检查路由定义中是否有正确的 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';
}]);

different controller names in this example will lead to errors, but this example is correct

SECOND 检查是否导入了 javascript 文件:

<script src="modules/community/controllers/CommunityMembersCtrl.js"></script>

我也遇到过同样的问题,在我的案例中,它是由于这个问题而发生的:

我将控制器定义在一个单独的模块(称为“ myApp.controller”)中,并将其注入到主应用程序模块(称为“ myApp”)中,如下所示:

angular.module('myApp', ['myApp.controllers'])

一个同事把另一个控制器模块放在一个单独的文件中,但是它的名字和我的完全一样(例如‘ myApp.controller’) ,这就导致了这个错误。我觉得是因为 Angular 把控制器模块搞混了。然而,错误消息对于发现问题所在并没有太大帮助。

医学院的第二个观点是我的陷阱但是我要声明,也许这对某些人有帮助:

我也遇到了同样的问题,就在我发疯之前,我发现我忘记了包含我的控制器脚本。

由于我的应用程序是基于 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>

现在我再也不用考虑手动包含这些文件了。 事后看来,我真的应该这样做时,设置项目..。

LoginController 出现了一个明显的错误,我在 main index.html 中使用了它。 我找到了两种解决办法:

  1. 设置 $controller erProvider.allowGlobals () ,我发现在 Angular < a href = “ https://github.com/angle/Angular.js/commit/3f2232b5a181512fac23775b1df4a6ebda67d018”rel = “ nofollow”> change-list 中的注释 “这个选项对于迁移旧的应用程序可能很方便,但是请不要在新的应用程序中使用它!”关于 Angular 的原创评论

    Config (“ $ControlerProvider”,函数($ControlerProvider){ $ControlerProvider.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']);

Some times this error is a result of ng-app directives specified in the html. 在我的例子中,我错误地在 html标记中指定了 ng-app,在 body标记中指定了 ng-app="myApp",如下所示:

<html ng-app>
<body ng-app="myApp"></body>
</html>

在我的情况下(有一个概述页面和一个“添加”页面) ,我得到了这与我的路由设置如下。它为无法注入的 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 模板,但是找不到它的控制器。

删除’/’-路由时,case 为我修复了这个问题。

我在一个大错误上犯了同样的错误:

appFormid.controller('TreeEditStepControlsCtrl', [$scope, function($scope){


}]);

你看,我忘记了在第一个 $scope 前后,正确的语法当然是:

appFormid.controller('TreeEditStepControlsCtrl', ['$scope', function($scope){


}]);

我没有马上看到的第一个错误是: “ $scope 没有定义”,接着是“ 错误: [ ng: areq ]参数“ TreeEditStepControlsCtrl”不是函数,未定义

这真的花了我4个小时(包括无休止的搜索 SO) ,但最终我还是找到了它: 由于错误(无意中) ,我在某处添加了一个空格。

你能看出来吗?

angular.module('bwshopper.signup').controller('SignupCtrl ', SignupCtrl);

所以... 4个小时后,我看到它应该是:

angular.module('bwshopper.signup').controller('SignupCtrl', SignupCtrl);

几乎不可能用肉眼看到。

这强调了修订控制(git 或其他东西)和单元/回归测试的重要性。

是不是可以简单到把你的资产放在“”里面,然后把需要引用的内容放在“”里面?

<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">

becomes

<link rel="stylesheet" media="screen" href="@routes.Assets.at('stylesheets/main.css')">

这可能会导致解析出现一些问题

如果你在一个子模块中,不要忘记在主应用程序中声明这个模块。 即:

<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”不是一个函数,没有定义。

为了解决这个问题,我不得不发现我在角度路线声明中拼错了控制器的名称:

.when('/todo',{
templateUrl: 'partials/todo.html',
controller: 'TodoCtrl'
})

在我的案例中,这是 index.html中一个简单的打字错误:

<script src="assets/javascript/controllers/questionssIndexController.js"></script>

应该是的

<script src="assets/javascript/controllers/questionsIndexController.js"></script>

控制器名称中没有额外的 s

原来它是浏览器的缓存,在这里使用 Chrome。简单地检查一下检查(元素)下的“禁用缓存”就解决了我的问题。

Because this pops-up in Google when trying to find an answer to: "Error: Argument '' is not a function, got undefined".

您可能正在尝试创建同一个模块两次。

Module 是一个用于创建、注册和 检索 AngularJS 模块。

传递一个参数将检索现有的 anger.Module,而 传递多个参数创建一个新的 anger.Module

资料来源: https://docs.angularjs.org/api/ng/function/angular.module#overview

例如:

angular.module('myApp', [])用于在不注入任何依赖项的情况下创建模块。

angular.module('myApp') (Without argument) is used to get an existing module.

似乎有 许多可行的解决方案表明错误有 很多真正的原因

在我的例子中,我没有在 app/index.html中声明控制器:

<scipt src="src/controllers/controller-name.controller.js"></script>

错误消失。

我知道这个问题已经过时了,AngularJS 也即将退出历史舞台,但我还是想补充一下我的答案。在我的示例中,我在 VisualStudio 代码中创建了一个新文件,但是没有添加。Js 扩展到我的控制器文件名。这就是导致我犯这个错误的原因。