为 Angular ui 网格实施外部过滤器的方便方法是什么

What could be convenient way to implement filter external for Angular ui grid

在第 50 行的 source code 处说:

/**
           * @ngdoc event
           * @name filterChanged
           * @eventOf  ui.grid.core.api:PublicApi
           * @description  is raised after the filter is changed.  The nature
           * of the watch expression doesn't allow notification of what changed,
           * so the receiver of this event will need to re-extract the filter 
           * conditions from the columns.
           * 
           */
          this.registerEvent( 'core', 'filterChanged' );

在我的例子中,我有 people table 三列,分别是 NameSurnameEmail。我可以处理 filterChanged:

vm1.gridApi.core.on.filterChanged($scope, function () {
....
}

将我的所有参数发送到服务器端并在所有字段中搜索。

这可能适用于少数列。 See plunker

对于巨大的table在客户端有什么方便的处理方式?

在@PaulL 的回答的帮助下,我得到了这个解决方案:

vm.gridApi.core.on.filterChanged($scope, function () {
    var grid = vm.gridApi.grid;
    var filters = [];
    vm.gridApi.grid.columns.forEach(function (column) {
        if (column.filters && column.filters[0].term) {
            filters[column.name] = column.filters[0].term;
        };
    });
    console.log(filters);
    service.getEntries(filters, paginationOptions.pageNumber, paginationOptions.pageSize, paginationOptions.sortDir).
    then(function (result) {
        vm.gridOptions.data = result.data.value;
    })
});

通常我会使用以下方法提取它们:

var filters = [];
$scope.gridApi.grid.columns.forEach( function(column) {
  if( column.filters && column.filters.length > 0 ) {
    filters.push({name: column.name, filters: column.filters});
  };
});

然后您可以在发送到服务器之前适当地处理这些过滤器。我通常也会对过滤器进行去抖动,你不想每次按键都调用服务器。