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

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文件:

&lt;script src="modules/community/controllers/CommunityMembersCtrl.js"&gt;&lt;/script&gt;

【讨论】:

根据我的经验,您的“第二”始终是问题所在。我经常忘记将控制器导入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'不是函数,未定义

Bourbon Refills Navigation JavaScript 错误:未捕获类型错误:未定义不是函数

未捕获的类型错误:未定义不是日期选择器引导程序的函数