【问题标题】:Argument ... is not a function, got undefined参数 ... 不是函数,未定义
【发布时间】:2013-03-22 00:21:09
【问题描述】:

我正在使用 AngularJS,但收到一条错误消息:Argument 'Controller' is not a function, got undefined 这是JSFiddle,以及 HTML 代码:

<h2>Hata's Tree-Like Set</h2>
<div ng-app ng-init="N=3;" ng-controller="Controller">
<input type="range" min="1" max="10" step="1" ng-model="N">  
<div class="tree"></div>
</div

然后我在 JavaScript 中定义了 Controller 函数,由于某种原因没有注册。

function Controller($scope){
$scope.$watch("N", function(){  ... });}

【问题讨论】:

标签: javascript angularjs


【解决方案1】:

我遇到了完全相同的错误:argument 'HelloCtrl' is not a function,未定义。

原来我的hello.js 文件中有语法错误...HelloCtrl() 内的数组定义中缺少逗号。

我添加了逗号,然后一切都开始工作了!

希望这会有所帮助。

【讨论】:

  • 它没有,我们不知道逗号应该去哪里。请举个例子
  • 他的意思是“它可能在任何地方,没有任何东西,甚至浏览器控制台,都不会告诉你在哪里”。你只需要用细齿梳子检查你的男女同校。如果您能记住上次更改的内容,或者有一个可以比较的备份版本,这将很有帮助。我经常遇到这个错误,对我来说,它一直是由不匹配的括号引起的。 YMMV。
  • 对于它的价值,我刚刚追踪到我最新的此类错误到阵列问题。我不得不注释掉昨晚写的一大块代码,然后一点一点地取消注释。我有 myData.push(val: i); 而不是 $scope.myData.push({val: i});`` - mssing $scope` 并且缺少大括号。当然,这意味着我的控制器不是一个函数;-) 解决这个错误的方法很简单。
【解决方案2】:

我遇到了同样的错误...参数“RadioController”不是函数...

我在 HTML 中引用了错误的控制器。我有

data-ng-controller="RadioController"

应该是什么时候

 data-ng-controller="Radio.RadioController"

('Radio' 是控制器所在的模块)

【讨论】:

    【解决方案3】:

    在您的小提琴选项中,您选择执行您的 javasctipt onLoad。 使用onLoadoption,您的javascript被添加到window.onLoadfunction:

        window.onload=function(){
           function Controller($scope){
              ...
           }
        }
    

    因此 Angular 无法访问您的代码,因为它位于闭包中。

    使用no wrap选项,您的代码将直接添加到页面中,并且可以通过 angular 访问:JSFiddle

    您可以浏览源代码以了解其工作原理。

    【讨论】:

    • 滑块应该控制树枝的复杂性,基本上是for循环中的值N
    • 请解释您提到的no wrap 选项。这个答案缺少一些上下文,使其不太有用。
    • 只是为了澄清 - no wrap 选项在 jsfiddle 中,而不是有角度的(您可以在左侧的控制栏中看到它)。删除它会删除导致 OPs 问题的关闭。有关关闭的更多信息:stackoverflow.com/questions/111102/…
    【解决方案4】:

    您可以定义一个控制器并在一个步骤中注册它:

    angular.module('myModule').controller('MyCtrl', function($scope) {
      $scope.$watch ....
    });
    

    如果您希望代码在缩小后正常工作,则必须明确指定对 $scope 的依赖:

    angular.module('myModule').controller('MyCtrl', ['$scope', function(s) { 
      // you can now name the $scope argument whatever you want
      ...
    }]);
    

    【讨论】:

    • 对我没有任何影响。
    【解决方案5】:

    我也遇到了困难。我的问题的原因是我有一个旧版本的 Angular,它不支持新的 as 别名。

    确保您拥有支持 as 的最新版本的 Angular。

    【讨论】:

      【解决方案6】:

      您是否正确配置了 $controllerProvider?

      来自documentation

      使用当前 $controllerProvider 注册的构造函数的名称或在当前范围内计算为构造函数的表达式。

      可以通过指定 ng-controller="as propertyName" 将控制器实例发布到范围属性中。

      如果当前 $controllerProvider 被配置为使用全局变量(通过 $controllerProvider.allowGlobals()),这也可能是全局可访问构造函数的名称(不推荐)。

      【讨论】:

        【解决方案7】:

        好吧,我通过降级到旧版 Angular JS (1.2.27) 成功解决了这个错误。

        定义控制器和 Angular JS (1.3.2) 的相同语法(您在上面使用过)是导致此错误的组合。

        使用 angular (1.3.2),以下语法对我有用。

        var app = angular.module('dummyApp', []);
        
        app.controller('helloController', function($scope){
            <write statements here>
        });
        

        【讨论】:

          【解决方案8】:

          无需降级到旧版本。 您可以同时使用 as 方法或 angular.module 方法。

          加载文件的顺序也必须正确。

          如果您很难记住加载文件的顺序,请考虑 require js

          【讨论】:

            【解决方案9】:

            我不得不重新排序脚本标签。我把控制器放在比它依赖的另一个更高的位置。

            花了我几个小时,希望这对其他人有帮助

            【讨论】:

              【解决方案10】:

              我遇到了这个错误 - 我在我的控制器名称中弄错了案例。

              它被注册为 CallbacksController... 我花了五分钟发誓发现大小写差异(提示 - 在我的情况下大写 B!)。

              【讨论】:

                猜你喜欢
                • 2015-09-10
                • 2016-10-28
                • 2016-12-17
                • 2016-05-22
                • 2014-06-29
                • 1970-01-01
                • 2017-01-13
                • 2015-05-17
                • 1970-01-01
                相关资源
                最近更新 更多