如何在角度ng-table中为不同的列添加不同的滤波器比较器?

时间:2017-04-28 07:09:42

标签: angularjs filter ngtable

我使用ng-table创建了一个表,如下所示。

 $scope.tableParams = new NgTableParams({}, {
   filterOptions: { filterComparator:angular.equals },
   dataset:$scope.usersList  
          });

这是我的HTML。

<table ng-table="tableParams" show-filter="true" class="table table-condensed table-bordered">
    <tr ng-repeat="user in $data">
        <td data-title="'User ID'" header-class="'text-left'" sortable="'id'" filter="{ 'id': 'text' }">
            {{user.id}}
        </td>

        <td data-title="'Username'" header-class="'text-left'" sortable="'username'" filter="{ 'username': 'text' }">
            {{user.username}}
        </td>
        <td data-title="'Name'" filter="{status: 'select'}" filter-data="status" sortable="'status'">{{ user.status }}</td>

    </tr>
</table>

当过滤&#34;状态&#34;时,我希望输出完全匹配。但是当过滤&#34;用户名&#34;我希望它像包含一样。因为我已经给了&#34; filterComparator&#34; as&#34; angular.equals&#34; ,现在整个表被过滤为完全匹配。但是我怎样才能过滤&#34; status&#34;列是完全匹配而其他列是否包含?

2 个答案:

答案 0 :(得分:2)

我认为不能以干净的方式完成。

对于相同的用例,我编写了一个filterComparator函数,并根据传递给函数的参数类型决定了我想做的比较。

function filterComparator(actual, expected) {
    if (expected instanceof Date) {
        // using moment.js for date comparison
        return moment(actual).isSame(moment(expected), 'day');
    } else {
        // default: case insensitive substring match
        return actual.toString().search(new RegExp(expected.toString(), 'i')) != -1;
    }
}

您是否能够以不同的方式解决问题?我很想听听。

答案 1 :(得分:2)

我写了一个过滤函数来比较两个字符串的相等性

angular.module('myApp').filter('equalComparator', function($filter) {
    return function(values, searchTerm , property) {
        var filtered = [];

        if(typeof values != 'undefined' && typeof searchTerm != 'undefined') {
            angular.forEach(values, function(value) {

                if(value[property] == searchTerm ) {
                    filtered.push(value);
                }

            });
        }

        return filtered;
    }
})

然后使用这个&#34; equalComparator&#34;在ngtable过滤方法中如下

   if(params.filter()[//column name to filter]) {
          $scope.filteredData = $filter('equalComparator')($scope.filteredData,params.filter()[//column name to filter] ,//field name to filter);
    }