Ng-сетчатый фильтр с 2 условиями

У меня есть требование отфильтровать таблицу на основе

  1. один столбец и
  2. по сравнению столбцов.

Я использую ng-grid для заполнения таблицы. Это дает возможность фильтровать на основе одного столбца.

Для сравнения столбцов я использую grid.refresh() функция. эта функция вызывает grid.registerRowsProcessor( $scope.columnComparionFilter, 200 )функция. Я подготовился columnComparionFilter функция, которая возвращает 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;
};

Оба фильтра отлично работают в одиночку. Но когда я пытаюсь работать вместе. Фильтрует по умолчанию только на основе одного фильтра. Это устраняет через фильтр столбцов.

Может ли кто-нибудь помочь мне решить это?

1 ответ

Решение

На самом деле 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;
    }
};
Другие вопросы по тегам