具有 2 个条件的 Ng-grid 过滤器

Ng-grid filter with 2 condition

我需要根据

过滤table
  1. 单列和
  2. 跨列比较。

我正在使用 ng-grid 来填充 table。它提供了基于单列过滤的功能。

对于跨列比较,我使用 grid.refresh() 函数。此函数调用 grid.registerRowsProcessor( $scope.columnComparionFilter, 200 ) 函数。我准备了 columnComparionFilter 函数,returns renderableRows 基于过滤器。下面是示例代码:

// function to filter two column based on condition
$scope.columnComparionFilter= function(renderableRows){
    // if filter option selection changed
    if($scope.change){
        if($scope.column1 == undefined)
            return renderableRows;
        if($scope.column2 == undefined)
            return renderableRows;
        if($scope.column1 == $scope.column2){
            console.log('columns for comparision should be different.')
            return renderableRows;
        }
        if($scope.selectedFilter.name == 'compare'){
            renderableRows.forEach( function( row ) {
                if(row.entity[$scope.column1.field] == row.entity[$scope.column2.field])
                    row.visible = true;
                else
                    row.visible = false;
            });
        }else if($scope.selectedFilter.name == 'distinct'){
            renderableRows.forEach( function( row ) {
                if(row.entity[$scope.column1.field] != row.entity[$scope.column2.field])
                    row.visible = true;
                else
                    row.visible = false;
            });
        }
    }
    return renderableRows;
};

两个过滤器都可以单独使用。 但是当我尝试一起工作时。默认情况下,它仅基于单个过滤器进行过滤。它消除了跨列过滤器。

谁能帮我解决这个问题?

其实grid.registerRowsProcessor()ng-grid单列过滤器使用的核心函数。因此,当我尝试使用相同的函数进行跨过滤时,它会导致同步问题,单列过滤器会控制我的自定义函数。

我使用了替代方法来修改 ng-grid 数据。我已经使用 notifyDataChange() 函数解决了它。在外部过滤器函数中 columnComparionFilter 我正在准备基于过滤器的数据子集,然后我将 gridOptions.data 更改为子集数据。见以下代码:

// function to filter two column based on condition
$scope.columnComparionFilter= function(renderableRows){
    // if filter option selection changed
    if($scope.change){
        if($scope.column1 == undefined){
            console.log('Please select first column to compare.')
            return;
        }
        if($scope.column2 == undefined){
            console.log('Please select second column to compare.')
            return;
        }
        if($scope.column1 == $scope.column2){
            console.log('columns for comparision should be different.')
            return;
        }
        if($scope.selectedFilter.name == 'compare'){
            renderableRows.forEach( function( row ) {                
                if(row[$scope.column1.field] == row[$scope.column2.field])
                    filterData.push(row)
            });
        }else if($scope.selectedFilter.name == 'distinct'){
            renderableRows.forEach( function( row ) {
                if(row[$scope.column1.field] != row[$scope.column2.field])
                    filterData.push(row)
            });
        }
        $scope.gridOptions.data = angular.copy(filterData);
        $scope.gridApi.core.notifyDataChange(uiGridConstants.dataChange.ALL);
        return;
    }
};