Ng-сетчатый фильтр с 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;
}
};