2016-03-05 103 views
1

我在左邊有按鈕的字段列表(todos)。我想單擊其中一個按鈕,以便計算此特定字段的值。AngularJS - 計算每個字段的值

什麼我得到的是點擊特定按鈕計算並顯示所有字段相同的結果

這是我寫的:

<h1 ng-show="myVar"> 
    <ul> 
    <li ng-repeat="todo in todos"> 
     <button ng-show="!editing[$index]" ng-click="edit($index)">click</button> 
     <h2> Result is:{{result}}</h2> 
     {{todo.name}} 
    </li> 
    </ul> 
    </h1> 

和控制器

 $scope.edit = function(index){ 

     var todo = $scope.todos[index]; 
     var counter = 0; 
     angular.forEach($scope.todos,function(value,index){ 
      if (todo.topic == 'important') 
      {counter = counter+1;} 

     }) 
     $scope.result = counter; 
     } 

我在做什麼錯?

回答

2

基本上已用於結合的scoperesult變量不是已內部控制器範圍所定義的相同範圍的變量。

因爲ng-repeat不會工作在一個完全不同的方式,當它通過提供收集循環渲染DOM(這裏的todos),它創造了它prototypically從它的父作用域繼承每個迭代一個新的範圍。

不要使用Dot Rule而定義模型,以便它遵循原型繼承,

$scope.model = {}; 

//then use 
$scope.model.result = result; 

HTML

<h2> Result is:{{model.result}}</h2> 

其他方式來解決這問題出將使用而controllerAs方法定義控制器,但在這種情況下,您需要讀取$scope &應替換爲this t的控制器功能。

+0

這非常有幫助!現在它計算出正確的結果。 唯一的是我看到所有字段旁邊的結果。我怎樣才能改變它,結果只會顯示在特定的領域,而不是每個人? –

+0

@ A.Sh然後傳遞該特定對象來編輯像ng-click =「edit(todo)」這樣的方法,並將結果屬性添加到todo對象中,這樣就可以通過使用'todo.result '。 –

+0

todo是來自db的字段...你是否要將結果屬性添加到數據庫?因爲我不想更改分貝。我可以做不同嗎? –

0

您使用相同的index變量名作爲函數輸入參數 - function(index)和forEach循環,function(value,index){ - 它會被覆蓋。

//here 
$scope.edit = function(index){ 

    var todo = $scope.todos[index]; 
    var counter = 0; 
//and here 
    angular.forEach($scope.todos,function(value,index){ 
+0

但我爲每個按鈕調用這個函數,所以'$ scope.edit = function(index){'中的索引每次都會改變,不是? –