【问题标题】:angular ui grid single filter + cellfilter角度 ui 网格单过滤器 + 单元过滤器
【发布时间】:2023-04-06 03:57:02
【问题描述】:

如文档中所述,我已经使用 ui 网格实现了单个过滤器。 http://ui-grid.info/docs/#/tutorial/321_singleFilter

但是我有一个 cellFilter,当我过滤时,它会过滤数据,而不是使用过滤器渲染数据。这对最终用户来说是错误的。

例如,在这个 plunker 上,我想过滤“男性”或“女性”输入。

http://plnkr.co/edit/TNJSlc0QkBI8Tu2Jejam?p=preview

var app = angular.module('app', ['ngTouch', 'ui.grid']);

app.controller('MainCtrl', ['$scope', '$http', function ($scope, $http) {
  var today = new Date();
  $scope.gridOptions = {
    enableFiltering: false,
    onRegisterApi: function(gridApi){
      $scope.gridApi = gridApi;
      $scope.gridApi.grid.registerRowsProcessor( $scope.singleFilter, 200 );
    },
    columnDefs: [
      { field: 'name' },
      { field: 'gender', cellFilter: 'mapGender' },
      { field: 'company' },
      { field: 'email' },
      { field: 'phone' },
      { field: 'age' },
      { field: 'mixedDate' }
    ]
  };

  $http.get('https://cdn.rawgit.com/angular-ui/ui-grid.info/gh-pages/data/500_complex.json')
    .success(function(data) {
      $scope.gridOptions.data = data;
      $scope.gridOptions.data[0].age = -5;

      data.forEach( function addDates( row, index ){
        row.mixedDate = new Date();
        row.mixedDate.setDate(today.getDate() + ( index % 14 ) );
        row.gender = row.gender==='male' ? '1' : '2';
      });
    });

  $scope.filter = function() {
    $scope.gridApi.grid.refresh();
  };

  $scope.singleFilter = function( renderableRows ){
    var matcher = new RegExp($scope.filterValue);
    renderableRows.forEach( function( row ) {
      var match = false;
      [ 'name', 'company', 'email', 'gender' ].forEach(function( field ){ 
        //row.entity[field] for gender col is 1 or 2 instead of male or female
        if ( row.entity[field].match(matcher) ){
          match = true;
        }
      });
      if ( !match ){
        row.visible = false;
      }
    });
    return renderableRows;
  };
}])
.filter('mapGender', function() {
  var genderHash = {
    1: 'male',
    2: 'female'
  };

  return function(input) {
    if (!input){
      return '';
    } else {
      return genderHash[input];
    }
  };
});

【问题讨论】:

    标签: javascript angularjs angular-ui-grid ui-grid


    【解决方案1】:

    有一个名为 filterCellFiltered 的单元格选项,您可以将其应用于您的 columnDefs:

    { field: 'gender', cellFilter: 'mapGender', filterCellFiltered: true },
    

    uiGrid 将在应用“搜索”过滤器之前应用 cellFilter。不幸的是,此选项仅适用于 columnFilters。但是我们仍然可以在 singleFilter 代码中使用它来检查我们是要匹配正常值还是过滤值。

    不确定这是否是最好的方法,但这是我的解决方案:

      $scope.singleFilter = function( renderableRows ){
        var matcher = new RegExp($scope.filterValue);
        renderableRows.forEach( function( row ) {
          var match = false;
          row.grid.columns.forEach(function( column ){
    
            // get the filtered value, if filterCellFiltered option is set      
            var value;
            if ( column.filterCellFiltered ){
              value = row.grid.getCellDisplayValue(row, column);
            } else {
              value = row.grid.getCellValue(row, column);
            }
    
            if ( value.toString().match(matcher) ){
              match = true;
            }
          });
    
          if ( !match ){
            row.visible = false;
          }
        });
        return renderableRows;
      };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      相关资源
      最近更新 更多