首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将过滤后的对象属性聚合成ng-重复角

如何将过滤后的对象属性聚合成ng-重复角
EN

Stack Overflow用户
提问于 2014-09-22 17:00:14
回答 2查看 4K关注 0票数 0

我使用了角1.2.16并过滤了如下所示的对象列表:

代码语言:javascript
复制
<li ng-repeat="item in filteredItems = (items | filter:query)">
  {{item.title}}
</li>

假设下面有"items“数组

代码语言:javascript
复制
var items = [ { title: "foo", priority: 1 },
              { title: "bar", priority: 2 },
              { title: "bla", priority: 1 } ];

在用"b“过滤后,角集"filteredItems”设置为

代码语言:javascript
复制
filteredItems == [ { title: "bar", priority: 2 },
                   { title: "bla", priority: 1 } ];

我想要做的是计数每种优先级类型的出现情况,后过滤器,并打印出来。例如,给定上述场景的输出将打印priority-1 = 2, priority-2 = 1,然后在应用过滤器"b“后成为priority-1 = 1, priority-2 = 1

我该怎么做呢?

我尝试创建一个新的控制器,然后使用$scope.$parent.filteredItems,但是filteredItems部分不会动态更新。

这是一个plunkr http://plnkr.co/edit/uA5TgBVFVEd89dHSP0Yo

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-22 19:35:37

本·纳德尔的这篇文章最接近于回答我的问题,它添加了一个自定义指令,在ng-重复完成后触发一个事件。然而,这比我想要的要复杂一些。

我的最后一种方法是向控制器中添加一个自定义$filter,当输入发生变化时会触发它,并最终创建一个可以打印出来的摘要对象。柱塞可以找到这里

HTML:

代码语言:javascript
复制
    <input ng-model="query" type="text" ng-change="myFilter(query)" />

    <ul>
      <li ng-repeat="item in items">
        <pre>{{item}}</pre></li>
    </ul>

    <h3>Summary of items</h3>
    <p >
      Priority-1: {{summary.p1}}<br>
      Priority-2: {{summary.p2}}
    </p>

  </body>

The App.js

代码语言:javascript
复制
var app = angular.module('app', []);

app.controller('ParentCtrl', ['$scope', '$filter',
  function($scope, $filter) {

    $scope.originalItems = [{
      title: "foo",
      priority: 1
    }, {
      title: "bar",
      priority: 2
    }, {
      title: "bla",
      priority: 1
    }];

    $scope.items = $scope.originalItems;

    var summarize = function(items) {
      var summary = {
        p1: 0,
        p2: 0
      };
      for (var i in items) {
        switch (items[i].priority) {
          case 1:
            summary.p1++;
            break;
          case 2:
            summary.p2++;
            break;
        }
      }
      return summary;
    };

    $scope.myFilter = function(query) {
      $scope.items = $filter('myFilter')($scope.originalItems, query);
      $scope.summary = summarize($scope.items);
    }

    $scope.summary = summarize($scope.items);

  }
]);

app.filter('myFilter', ['$filter',
  function($filter) {
    return function(items, query) {
      return $filter('filter')(items, query);
    };
  }
]);
票数 0
EN

Stack Overflow用户

发布于 2014-12-23 06:15:45

更简单的方法,但仍然不理想:

http://plnkr.co/edit/wkGKYQus2exkLycIu9XB?p=preview

html:

代码语言:javascript
复制
<body ng-controller="ParentCtrl">
  <input ng-model="query" type="text"/>

  <ul>
    <li ng-repeat="item in items | filter : query">
      <pre>{{item}}</pre></li>
  </ul>
  <h3>Summary of items</h3>
  <p >
    Priority-1: {{items | filter : query | sumFilter: '1'}}<br>
    Priority-2: {{items | filter : query | sumFilter: '2'}}
  </p>
</body>

联署材料:

代码语言:javascript
复制
app.filter('sumFilter', function() {
  return function(items, value) {
    var summary = 0; 
    for (var i in items) {
      if (items[i].priority == value) {
        summary++;
      }
    }
    return summary;
  }
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25979360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档