在角度过滤器中添加索引

时间:2015-03-31 17:49:49

标签: javascript angularjs

由于各种原因,我使用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&#39;&#39;%3B%20newVal%3A%20%5℃%22%5C %22%3B%20oldVal%3A%20undefined%22%5D%5D

这与摘要周期中的无限循环有关。我怀疑通过添加到项目列表,我正在破坏$index使用的数组/ ng-repeat

我可以转换控制器/服务中的项目列表,但这似乎不正确,因为这基本上只是为了演示而完成。

1 个答案:

答案 0 :(得分:0)

请勿更改过滤器上的项目的属性。这将再次调用forEach循环。

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

如果需要更新转换数组上的classheader标志,可以更改代码以使用angular copy:

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;            
    };
}
);