2012-11-08 27 views
20

Düğmeye tıklandığında removePlayer(playerId) yöntemini çağırmaya çalışıyorum. Ancak, yöntem çağrılmıyor veya en azından içerdeki ifadeler ateş etmiyor, çünkü üstte bir console.log() deyim koydu.AngularJS - denetleyici yöntemi çağrılmadı ngClick - hata yok

Konsol boş, bu yüzden gerçekten clueless. İşte benim kodudur:

Denetleyici:

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

Oynatıcı neden modelde değil, denetleyicide? – LeeGee

+0

Sadece AngularJS'i deniyordum, sadece ne olduğunu keşfetmek için. 'Gerçek' bir proje değildi. @LeeGee – 11684

cevap

38

bakınız. Sen yazmalısınız:

belirtildiği gibi

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

+0

Yeni ng tekrar kapsamı, ana kapsamdan miras mı? Yani cevabımdaki "ebeveyn" gerekli değil mi? – dnc253

+2

Evet, "ng-repeat" tarafından oluşturulan kapsamlar bir ana kapsamdan devralır, böylece "$ parent" başvurusu gerekli değildir. Aslında, '$ parent' kullanmaktan kaçınmayı tercih etmeliyiz çünkü o olay düzenleyicilerindeki ifadeleri şablon yapısına güçlü bir şekilde bağlar (başka bir kapsam oluşturma yönergesi eklemek yeterlidir ve işler bozulabilir). –

+0

Teşekkürler, hepsi mantıklı. Sadece bir "ng-repeat" içinde "$ parent" kullanan yerleri görmeyi hatırlıyorum ve bunun konu olduğunu düşünüyordum. + 1 sana. – dnc253

4

ng-repeat yeni kapsamını oluşturur, bu nedenle removePlayer ne olduğunu bilmiyor. Böyle bir şey yapmak mümkün olmalıdır:

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

Sen ng tıklama ifadesinde küme parantezi ({{ }}) kullanılarak olmamalıdır https://groups.google.com/forum/?fromgroups=#!topic/angular/NXyZHRTAnLA

+0

Vay, Bunu bilmiyordum. Şimdi deniyorum! – 11684

+0

Çalışmıyor ... Herhangi bir fikir var mı? – 11684

+1

Sorunu yeniden oluşturan bir jsFiddle oluşturabilir misiniz? Bu, kesin problemi teşhis etmeyi kolaylaştıracaktır. Ayrıca, işlev çağrısında '{{}}' fark ettim. İşe çağırırken bunlara ihtiyacın olmadığına inanıyorum. – dnc253

-1

, ng-repeat kendi kapsamı var oluşturur ve dış denetleyici kapsamı kullanılamaz. ,

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

Önceden, bir yere Denetleyiciniz ilklendirilişinde istediğiniz her şeyi içinde oyuncu nesne ve doğal olarak her kod için "removePlayer" işlevini assing edebilirsiniz: Ama JS kullandığınız beri gerçek nesneler böyle bir şey yazmak böylece dış denetleyiciye dolaylı olarak erişir.

İlgili konular