Angularjs摘要行过滤器

时间:2016-01-28 15:51:40

标签: angularjs row ng-repeat summary

我正在尝试构建一个自定义过滤器,它会向数组中添加一个摘要(avg)行。 我想像这样使用它:

<tr ng-repeat="item in items | summaryRow : ['col1', 'col1'] | orderBy : 'name'"

这是我的过滤器的样子:

summaryRow.$inject = ['$parse', 'sumFilter'];
function summaryRow($parse, sumFilter) {
    return function(array, fields, nameLabel) {
        var row = { id: 0 }, l = array.length, setter;
        row[nameLabel || 'name'] = 'Summary';
        for (var i = 0, j = fields.length; i < j; i++) {
            setter = $parse(fields[i]).assign;
            setter(row, sumFilter(array, fields[i]) / l);
        }
        return array.concat(row);
    }
}

问题是我希望这个额外的行可以排序并且知道项目中的变化。问题是我遇到了“10 $ digest()迭代次数。正在中止!”问题。任何帮助将不胜感激,谢谢!

2 个答案:

答案 0 :(得分:0)

尝试在控制器中使用$filter。这是Todd Motto写的一篇很棒的文章:

https://toddmotto.com/use-controller-filters-to-prevent-digest-performance-issues/

答案 1 :(得分:0)

找到了解决方案,这就是我想出的:

summaryRow.$inject = ['$parse', 'sumFilter'];
function summaryRow($parse, sumFilter) {
    var row = {};
    return function(array, fields, nameLabel) {
        clearObject(row);
        var l = array.length, setter;
        row.id = 0;
        row[nameLabel || 'name'] = 'Summary';
        for (var i = 0, j = fields.length; i < j; i++) {
            setter = $parse(fields[i]).assign;
            setter(row, sumFilter(array, fields[i]) / l);
        }
        return array.concat(row);
    }
}

这是clearObject实现:

function clearObject(obj) {
    for (var k in obj)
        delete obj[k];
}