2012-11-08 22 views
20

ボタンがクリックされると、removePlayer(playerId)メソッドを呼び出そうとしています。しかし、私はconsole.log()文を一番上に置いているので、メソッドは呼び出されないか、少なくともその中のステートメントは起動しません。AngularJS - ngClickでコントローラメソッドが呼び出されない - エラーなし

コンソールは空ですので、私は本当に無知です。ここに私のコードは次のとおりです。

コントローラー:

function appController($scope) { 
    $scope.players = []; 
    var playercount = 0; 

    $scope.addPlayer = function(playername) { 

     $scope.players.push({name: playername, score: 0, id: playercount}); 
     playercount++; 
    } 

    function getIndexOfPlayerWithId(playerId) { 
     for (var i = $scope.players.length - 1; i > -1; i--) { 
      if ($scope.players[i].id == playerId) 
       return i; 
     } 
    } 

    $scope.removePlayer = function(playerId) { 
     console.log("remove"); 
     var index = getIndexOfPlayerWithId(playerId); 
     $scope.players.slice(index, 1); 
    } 
} 
appController.$inject = ['$scope']; 

HTML:

... 
<table id="players"> 
     <tr ng-repeat="player in players"> 
      <td>{{player.name}}</td> 
      <td>{{player.score}}</td> 
      <td><button ng-click="removePlayer({{player.id}})">Remove</button></td> 
     </tr> 
    </table> 
... 
+0

コントローラ内のプレーヤーオブジェクトがモデルではないのはなぜですか? – LeeGee

+0

私はちょうどAngularJSを試していました。それは「本当の」プロジェクトではありませんでした。 @LeeGee – 11684

答えて

38

を参照してください。あなたは書く必要があります:述べ、NGリピートとして

<button ng-click="removePlayer(player.id)">Remove</button>

+0

新しいng-repeatスコープは、親スコープから継承しますか?私の答えの中の '$ parent'は必要ではありませんか? – dnc253

+2

はい、 'ng-repeat'で作成されたスコープは親スコープから継承し、' $ parent'参照は不要です。事実、 '$ parent'は、イベントハンドラの式をテンプレート構造と強く結びつけるので(' $ parent'の使用を避けるべきです)、別のスコープ作成ディレクティブを挿入すれば十分です。 –

+0

ありがとうございます、それはすべて理にかなっています。私はちょうど 'ng-repeat 'で' $ parent'を使っていた場所を見て覚えていて、これが問題だと思っていました。あなたに+1してください。 – dnc253

4

ng-repeatは新しいスコープを作成し、それがremovePlayerが何であるかを知りません。あなたはこのような何かを行うことができるはず:

<table id="players"> 
    <tr ng-repeat="player in players"> 
     <td>{{player.name}}</td> 
     <td>{{player.score}}</td> 
     <td><button ng-click="$parent.removePlayer({{player.id}})">Remove</button></td> 
    </tr> 
</table> 

あなたはNGクリック式の中括弧({{ }})を使用すべきではないhttps://groups.google.com/forum/?fromgroups=#!topic/angular/NXyZHRTAnLA

+0

うわー、私はこれについて知らなかった。今しよう! – 11684

+0

それは動作しません...任意のアイデア? – 11684

+1

問題を再現するjsFiddleを作成できますか?正確な問題を診断するのが簡単になります。また、関数の呼び出しで '{{}}'に気付きました。私はあなたが機能を呼び出すときにそれらを必要としないと信じています。 – dnc253

-1

は、それ自身のスコープを作成し、外側のコントローラスコープは使用できません。 、

<tr ng-repeat="player in players"> 
    <td>{{player.name}}</td> 
    <td>{{player.score}}</td> 
    <td><button ng-click="player.removePlayer()">Remove</button></td> 
</tr> 

予め、どこかのコントローラの初期化時にあなたが欲しい何であなたプレイヤオブジェクトと自然にコードのそれぞれに「removePlayer」機能をASSINGことができます。しかし、JSで使用しているので、真のオブジェクトは、このような何かを書きます間接的に外部コントローラにアクセスします。

関連する問題