控制器不是函数,而是未定义的,同时全局定义控制器。

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (41)

我正在使用angularj编写一个示例应用程序。我在下面的铬浏览器上看到了一个错误。

错误是

参数‘ContactController’不是函数,未定义

代码

<!DOCTYPE html>
<html ng-app>
<head>
    <script src="../angular.min.js"></script>
    <script type="text/javascript">
        function ContactController($scope) {
            $scope.contacts = ["abcd@gmail.com", "abcd@yahoo.co.in"];

            $scope.add = function() {
                $scope.contacts.push($scope.newcontact);
                $scope.newcontact = "";                 
            };
        }    
    </script>    
</head>

<body>    
    <h1>  modules sample </h1>

    <div ng-controller="ContactController">
        Email:<input type="text" ng-model="newcontact">
        <button ng-click="add()">Add</button>

        <h2> Contacts </h2>
        <ul>
            <li ng-repeat="contact in contacts"> {{contact}} </li>
        </ul>    
    </div>
</body> 
</html>
提问于
用户回答回答于

对于角1.3+,不能再在全局范围上使用全局控制器声明(没有显式注册)。需要使用module.controller语法。

例子:-

angular.module('app', [])
    .controller('ContactController', ['$scope', function ContactController($scope) {
        $scope.contacts = ["abcd@gmail.com", "abcd@yahoo.co.in"];

        $scope.add = function() {
            $scope.contacts.push($scope.newcontact);
            $scope.newcontact = "";

        };
    }]);

function ContactController($scope) {
    $scope.contacts = ["abcd@gmail.com", "abcd@yahoo.co.in"];

    $scope.add = function() {
        $scope.contacts.push($scope.newcontact);
        $scope.newcontact = "";
    };
}
ContactController.$inject = ['$scope'];
angular.module('app', []).controller('ContactController', ContactController);

这是一次彻底的改变,但是可以关闭以使用allowglobal。

例子:

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

以下是角源的评论:

  • 检查具有给定名称的控制器是否通过$controllerProvider
  • 检查当前作用域上的字符串是否返回构造函数
  • 如果$控制员提供#lowGlobals,请检查window[constructor]在全球window对象(不推荐)
 .....

expression = controllers.hasOwnProperty(constructor)
            ? controllers[constructor]
            : getter(locals.$scope, constructor, true) ||
                (globals ? getter($window, constructor, true) : undefined);

额外检查:

  • 请务必将名称放入ng-app关于角根元素的指令(例如:-html)也是。示例:-ng-app=“myApp”
  • 如果一切都很好,而且您仍然会遇到问题,请记住要确保脚本中包含了正确的文件。
  • 没有在不同的地方两次定义相同的模块,这会导致先前在同一模块上定义的任何实体都将被清除。
用户回答回答于

我遇到这个问题是因为我在闭包中包装了一个控制器定义文件:

(function() {
   ...stuff...
});

但我忘了实际调用闭包来执行定义代码,并告诉Javascript我的控制器存在。即,上述需要:

(function() {
   ...stuff...
})();

扫码关注云+社区