2012-11-08 12 views
20

Ich versuche, die Methode removePlayer(playerId) aufzurufen, wenn eine Schaltfläche geklickt wird. Aber die Methode wird nicht aufgerufen, oder zumindest die Anweisungen darin werden nicht ausgelöst, weil ich eine console.log()-Anweisung an die Spitze gesetzt habe.AngularJS - Controller-Methode wird nicht auf ngClick aufgerufen - kein Fehler

Die Konsole ist leer, also bin ich wirklich ahnungslos. Hier ist mein Code:

Controller:

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

Warum ist das Player-Objekt im Controller, nicht im Modell? – LeeGee

+0

Ich habe gerade AngularJS ausprobiert, nur um herauszufinden, was es war. Es war kein "echtes" Projekt. @LeeGee – 11684

Antwort

38

Sie sollten nicht im ng-Klick-Expression unter Verwendung von geschweiften Klammern ({{ }}) werden. Sie sollten schreiben:

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

+0

Erbt der neue ng-repeat-Bereich nur vom übergeordneten Bereich? Also wäre der $ Elternteil in meiner Antwort nicht nötig? – dnc253

+2

Ja, von 'ng-repeat' erstellte Bereiche erben von einem übergeordneten Bereich, sodass die Referenz '$ parent' nicht benötigt wird. Eigentlich sollte man lieber "$ parent" vermeiden, da es Ausdrücke in den Event-Handlern stark mit der Template-Struktur verknüpft (es reicht aus, eine andere skope-creating-Anweisung einzufügen und Dinge könnten kaputt gehen). –

+0

Danke, das macht alles Sinn. Ich erinnere mich nur daran, Orte zu sehen, die '$ parent' in' ng-repeat' verwendeten und dachte, dies sei das Problem. +1 für dich. – dnc253

4

ng-repeat schafft einen neuen Rahmen, so dass er nicht weiß, was removePlayer ist. Sie sollten so etwas zu tun in der Lage:

<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> 

Siehe https://groups.google.com/forum/?fromgroups=#!topic/angular/NXyZHRTAnLA

+0

Wow, ich wusste nichts davon. Jetzt versuchen! – 11684

+0

Es funktioniert nicht ... Irgendwelche Ideen? – 11684

+1

Können Sie ein jsFiddle erstellen, das das Problem neu erstellt? Das macht es einfacher, das genaue Problem zu diagnostizieren. Außerdem habe ich gerade den '{{}}' im Aufruf der Funktion bemerkt. Ich glaube, Sie brauchen diese beim Aufruf der Funktion nicht. – dnc253

-1

Wie bereits erwähnt, ng-Repeat schafft es eigene Umfang ist, und der äußere Steuerungsbereich ist nicht verfügbar. Da aber in JS Sie verwenden echte Objekte schreiben Sie etwas wie folgt aus:

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

Vorweg, irgendwo auf dem Controller-Initialisierung können Sie die „removePlayer“ -Funktion jedes Ihrer Spieler Objekt assing und natürlich Code in alles, was Sie wollen, Dadurch wird indirekt auf den äußeren Controller zugegriffen.

Verwandte Themen