AngularJS Group By Directive without External Dependencies

前端 未结 9 986
长发绾君心
长发绾君心 2020-11-29 01:01

I\'m new to Angular and would like to learn the best way to handle a problem. My goal is to have a reusable means to create group by headers. I created a solution which wor

9条回答
  •  忘掉有多难
    2020-11-29 01:15

    The code by JoshMB will not work correctly of you have multiple filters on the same dataset in the same view. The second time you group a filtered version of the dataset, it will change the same attribute in the original object, thus breaking the group breaks in the previously filtered versions.

    I solved this by adding the name of the "CHANGED" attribute as en extra filter parameter. Below is my updated version of the code.

    /*
     * groupBy
     *
     * Define when a group break occurs in a list of items
     *
     * @param {array}  the list of items
     * @param {String} then name of the field in the item from the list to group by
     * @param {String} then name boolean attribute that indicated the group changed for this filtered version of the set
    
     * @returns {array} the list of items with an added field name named with "_new"
     *                  appended to the group by field name
     *
     * @example     
    *

    {{item.groupfield}}

    * *
    *

    {{item.groupfield}}

    * * Typically you'll want to include Angular's orderBy filter first */ app.filter('groupBy', ['$parse', function ($parse) { return function (list, group_by, group_changed_attr) { var filtered = []; var prev_item = null; var group_changed = false; // this is a new field which is added to each item where we append "_CHANGED" // to indicate a field change in the list //var new_field = group_by + '_CHANGED'; //- JB 12/17/2013 var new_field = 'group_by_CHANGED'; if(group_changed_attr != undefined) new_field = group_changed_attr; // we need this of we want to group different filtered versions of the same set of objects ! // loop through each item in the list angular.forEach(list, function (item) { group_changed = false; // if not the first item if (prev_item !== null) { // check if any of the group by field changed //force group_by into Array group_by = angular.isArray(group_by) ? group_by : [group_by]; //check each group by parameter for (var i = 0, len = group_by.length; i < len; i++) { if ($parse(group_by[i])(prev_item) !== $parse(group_by[i])(item)) { group_changed = true; } } }// otherwise we have the first item in the list which is new else { group_changed = true; } // if the group changed, then add a new field to the item // to indicate this if (group_changed) { item[new_field] = true; } else { item[new_field] = false; } filtered.push(item); prev_item = item; }); return filtered; }; }]);

提交回复
热议问题