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 = [];

ありがとう

編集:

特定の「ページ」で使用されるAngular 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.$inject = [];」の削除 コントローラーファイルから問題を解決したのに、なぜ angular.js シードアプリにそれが含まれているのですか?

4

1 に答える 1

9

最後の行のためにそのエラーが発生しています

bankC.$inject = [];

これは、コントローラーが $scope を探している間、Angular インジェクターにコントローラーに何も注入しないように指示します。

これを次のように変更すると

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

それはうまくいくはずです。

angular が依存性注入を使用するため、最後の行が存在します。コントローラーでリクエストすると、Angular は $scope という名前の変数を探します。しかし、コードが縮小されている場合、難読化によって $scope の名前が別の名前に変更されます。これが発生したときに正気を維持するために、最後の行が導入されます。新しいコントローラーを宣言するときは常に、angular DI がそのコントローラーに挿入するすべての変数を含む最後の行を含めることをお勧めします。

注 : そのコントローラー (または類似のコントローラー) にさらに多くのものを注入することに関心がある場合は、bankC.$inject も更新する必要があります。

于 2012-08-07T14:05:55.450 に答える