ngTables中的角度自定义过滤

时间:2014-06-17 12:43:06

标签: javascript angularjs filtering ngtable

我正在尝试在ngTables中进行一些自定义过滤(simmilar to this example),但是使用文本输入字段。我有一组带有标准文本输入过滤器的列,对于其中一些我想使用我自己的过滤函数,而不是默认的角度$filter('filter')(array, params.filter()),但是类似于$filter('myOwnFilter')(array, params.filter())

在我的控制器中进行过滤:

var orderedData = params.filter() ? $filter('filter')(array, params.filter()) : array;

我有什么:

<td class="text-left" data-title="'Name'" filter="{ 'Column': 'myOwnFilter' }" data-sortable="'Column'">
  {{ array.Column }}
</td>

和模板:

<script type="text/ng-template" id="ng-table/filters/myOwnFilter.html">
  <input type="text" name="myOwnFilter" data-ng-model="params.filter()[name]" data-ng-if="filter == 'myOwnFilter'" class="input-filter form-control"/>
</script>

2 个答案:

答案 0 :(得分:4)

如本问题https://stackoverflow.com/a/27296677/61577所述,您必须使用自定义“比较器”功能作为控制器中的第三个参数。一个简单的例子

var myCustomComparator = function(value, searchTerm) {
    return (value || '').indexOf(searchTerm) > -1;
}

然后在你的getData回调中

var orderedData = params.filter() ? $filter('filter')(array, params.filter(), myCustomComparator) : array;

请注意,如果您需要针对不同列/字段的不同比较器,则必须检查params.filter()。

filter comparator

的角度文档

答案 1 :(得分:0)

假设您要添加一个过滤器,该过滤器仅显示属性平均值大于的行:

查看

<td data-title="'Average'" sortable="'avg'" filter="{ 'min': 'number' }">

控制器

vm.filtered = params.filter() ? filterData(params, vm.filtered) : vm.filtered;

自定义过滤器

function filterData(params, data) {
              var min;
              if (params.filter() && params.filter().min) {
                  //remove default params.filter().min filter
                  min = params.filter().min;
                  delete params.filter().min;
                  //filter data by min
                  data = _.filter(data, function (d) { return min <= d.avg; });
              }
              //use the normal filter
              data = params.filter() ? $filter('filter')(data, params.filter()) : data;
              if (min != undefined)//add it back
                  params.filter().min = min;
              return data;
          }