【问题标题】:Angularjs summary row filterAngularjs摘要行过滤器
【发布时间】:2016-01-28 15:51:40
【问题描述】:

我正在尝试构建一个自定义过滤器,它将向数组添加一个汇总(平均)行。 我想这样使用它:

<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() 迭代。中止!”问题。任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: angularjs row ng-repeat summary


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 不管怎样,看看$filter,它在性能方面要好得多。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 1970-01-01
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多