2015-03-31 18 views
2

由於各種原因,我正在使用Angular過濾器來添加到將由ng-repeat使用的項目列表中(基本上我需要在表格中的子標題下對某些項目進行分組)。添加到角度過濾器中的索引

app.filter('tableFilter', 

function(){  
    return function(items){ 

     if (!items){ 
      return; 
     } 

     var transformed = [];    
     for (var i = 0; i < items.length; i++){ 

      if (items[i].classid){ 

       if (i === 0 || items[i].classid !== items[i-1].classid){ 
        transformed.push({classheader : true}); 
       } 
       else{ 
        items[i].classheader = false; 
       } 
      } 
      transformed.push(items[i]); 
     }         
     return transformed;    
    } 
} 
); 

好消息是,它的工作原理。壞消息是,它產生的錯誤,第一個是:

[$ rootScope:infdig]
http://errors.angularjs.org/1.2.23/ $ rootScope/infdig P0 = 10 & P1 =%5B%5B%22fn%3 ...%圖7C%20 '' %3B%20newVal%3A%20%5℃%22%5℃%22%3B%20oldVal%3A%20undefined%22%5D%5D

這與在無限循環做消化週期。我懷疑,通過添加到項目列表我正在破壞ng-repeat使用的數組/ $index

我可以轉換控制器/服務中的項目列表,但這看起來不正確,因爲這基本上只是爲了演示而完成。

+0

你叫通過'$ filter'提供商控制器或服務的內部的過濾器?或者在視圖中將它用作表達式?我認爲後者是從ng-repeat提到的情況 - 但無法確定。 – cerd 2015-03-31 19:48:16

+0

@cerd不,這是在ng-repeat內部,基本上我想將行添加到表中。 – 2015-04-02 17:48:35

回答

0

不要更改過濾器上的項目的屬性。這將再次調用forEach循環。

刪除此行: items [i] .classheader = false;

,如果你需要改變陣列上更新classheader標誌,你可以改變你的代碼中使用的角度副本:

app.filter('tableFilter', 

function() {  
    return function(items){ 

     if (!items){ 
      return; 
     } 

     var transformed = [];    
     for (var i = 0; i < items.length; i++) { 

      var item = angular.copy(items[i]); 

      if (items[i].classid) { 

       if (i === 0 || items[i].classid !== items[i-1].classid) { 
        transformed.push({classheader : true}); 
       } else { 
        item.classheader = false; 
       } 
      } 
      transformed.push(item); 
     }    
     return transformed;    
    }; 
} 
); 
相關問題