AngularJS: Count Filtered Items

前端 未结 4 1731
醉话见心
醉话见心 2020-12-31 03:31

I am showing subsets of a list if a checkbox is checked. I would like to replace the X next to the checkbox with the count of the list matching the selection criteria. I hav

4条回答
  •  悲&欢浪女
    2020-12-31 04:17

    You could set that count in the view model itself while binding the data or just have a method on the scope that returns the count.

    app.controller('MainController', function($scope, filterFilter){
       ....
        $scope.getCount = function(strCat){
          return filterFilter( $scope.heroes, {comic:strCat}).length;
        }
        ...
    });
    

    and use it as:-

      Marvel [{{getCount("Marvel")}}]
      .....
      DC Comics [{{getCount("DC")}}]
    

    Plnkr

    If the list is non changing when you are on the page i would suggest finding out the length and binding it to a property in the view model itself, and use it in the view.

     //Set your data model
      $scope.cbMarvel = {value:true, count:getCount('Marvel')};
      $scope.cbDCComics = {value:true, count:getCount('DC')};
    

    and in your view

        Marvel [{{cbMarvel.count}}]
    

    Plnkr2

    If your dataset is huge, instead of using filter inside the getCount, use a forEach and populate the count for each type at once.


    Infact you do not need a filter at all, it seems inefficient to iterate through the same list using a filter in your case. Your's is a static list so categorize it in the controller itself.

    var comics = $scope.comics  = {}; //Dictionary of comics
      //Create the collection here.
      angular.forEach(heroes, function(itm){
        if(!comics[itm.comic]){
         comics[itm.comic] = {name:itm.comic, value:true, count:1, items:[itm] };
         return;
        }
    
        comics[itm.comic].count++; //Incr count
        comics[itm.comic].items.push(itm); //push specific item
      });
    

    and remove all the filters in your view and do:-

        
    {{ h.name}} - {{h.comic}}
    {{ h.name}} - {{h.comic}}

    Plnk3 - the better one

提交回复
热议问题