2012-08-07 82 views
2

我想用angular.js使用种子应用程序获得我的脚。

当浏览器执行我的控制,我得到以下错误:

TypeError: Cannot set property 'players' of undefined 
at new bankC (http://localhost:8888/monopoly/js/controllers.js:18:20) 
at invoke (http://localhost:8888/monopoly/lib/angular/angular.js:2795:28) 
at Object.instantiate (http://localhost:8888/monopoly/lib/angular/angular.js:2805:23) 
at http://localhost:8888/monopoly/lib/angular/angular.js:4620:24 
at update (http://localhost:8888/monopoly/lib/angular/angular.js:13692:26) 
at http://localhost:8888/monopoly/lib/angular/angular.js:8002:24 
at Array.forEach (native) 
at forEach (http://localhost:8888/monopoly/lib/angular/angular.js:110:11) 
at Object.Scope.$broadcast (http://localhost:8888/monopoly/lib/angular/angular.js:8000:11) 
at http://localhost:8888/monopoly/lib/angular/angular.js:7185:26 

这是控制器代码是controller.js文件

function bankC($scope) { 
    $scope.players = [ 
     { 
     id: 0, 
     name: "Playe1", 
     balance: 1500 
     }, 
     { 
     id: 1, 
     name: "Player2", 
     balance: 1500 
     }, 
     { 
     id: 2, 
     name: "Player 3", 
     balance: 1500 
     } 
    ]; 
} 
bankC.$inject = []; 

感谢

编辑:

它以角度js注册以便在某个“页面”上使用,

angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives']). 
config(['$routeProvider', function ($routeProvider) { 
    $routeProvider.when('/view1', {templateUrl: 'partials/partial1.html', controller: MyCtrl1}); 
    $routeProvider.when('/view2', {templateUrl: 'partials/partial2.html', controller: MyCtrl2}); 
    $routeProvider.when('/bank', {templateUrl: 'partials/bank.html', controller: bankC}); 
    $routeProvider.otherwise({redirectTo: '/bank'}); 
}]); 

EDIT2:

卸下 “bankC $注入= [];”从控制器文件解决了问题,那么为什么angular.js种子应用程序包含它?

+0

你确定你是用一个已定义的参数调用该函数,而不是未定义的吗? – sedran 2012-08-07 13:47:22

+0

我将如何在angularjs中定义参数?这可能是我会出错的地方.... – Cooltrooper 2012-08-07 13:52:52

+0

'bankC'函数是如何调用的? – jbabey 2012-08-07 13:56:07

回答

9

你得到,因为最后一行

bankC.$inject = []; 

这告诉角度注射器没有注入到控制器,而控制器寻找$范围的错误。

如果您更改为

bankC.$inject = ['$scope']; 

它应该工作的罚款。

最后一行存在,因为角使用了Dependancy Injection。当您在控制器中请求角度时,Angular将查找名称为$ scope的变量。但是,如果代码被缩小,那么混淆会将$ scope的名称更改为其他名称。为了在引入最后一行时发生这种情况,保持清醒。当你声明一个新的控制器时,最好的做法是将最后一行包含你想要angulars DI注入到控制器中的所有变量。

注意:如果您有兴趣将更多东西注入到控制器(或类似的控制器),那么您将不得不更新bankC。$ inject。

+0

应该angularjs自动做到这一点,因为我已经注册该控制器与该网址页面? – Cooltrooper 2012-08-07 14:07:23

+0

Angular自动调用/实例化相应的控制器。 如果您提供您的html或您的app.js,那么您会引用bankC,这将是一件好事。 – ganaraj 2012-08-07 14:10:32

+0

即时通讯使用partials,所以控制器没有在任何HTML注册,它是在我已经添加到我原来的问题的app.js注册。 – Cooltrooper 2012-08-07 14:12:34