Ag grid Ag Grid QuickFilter以编程方式更改搜索列

Ag grid Ag Grid QuickFilter以编程方式更改搜索列,ag-grid,Ag Grid,我需要一个快速搜索过滤器,用户可以选择哪些列被搜索。我没有成功地实施这种行为。 我试过这个: this.columns.forEach(column=>{ if (this.globalSearchSelectedColumns.indexOf(column.field)>-1) column.getQuickFilterText = (params)=> params.value.name; else column.getQui

我需要一个快速搜索过滤器,用户可以选择哪些列被搜索。我没有成功地实施这种行为。 我试过这个:

this.columns.forEach(column=>{
            if (this.globalSearchSelectedColumns.indexOf(column.field)>-1) column.getQuickFilterText = (params)=> params.value.name;
            else column.getQuickFilterText = ()=> '';
        });
this.grid.api.setColumnDefs(this.columns);
this.grid.api.onFilterChanged();
this.grid.api.resetQuickFilter();

其中this.columns是columns defs,this.grid是gridOptions,this.globalSearchSelectedColumns是按column.field搜索的选定列。

为了有选择地应用
quickFilter
表单ag网格,您应该重写
columnDef
的属性
getQuickFilterText
,通过将其设置为返回空字符串的函数,如下所示:

  • 首先,您需要通过
    gridColumnApi
  • 然后您需要访问它的
    colDef
  • 最后,您所要做的就是重写
    getQuickFilterText
    属性
  • 假设在类组件中有一个方法
    disableFilterCol
    ,它可以如下所示:

      disableFilterCol = () => {
        var col = this.gridColumnApi.getColumn("athlete");
        var colDef = col.getColDef();
        colDef.getQuickFilterText = () => "";
        console.log("disable Athlete");
      };
    
    this.grid.columnApi.getAllColumns().forEach(column=>{
        let def = column.getColDef();
        if (this.globalSearchSelectedColumns.indexOf(def.field)>-1) def.getQuickFilterText = undefined;
        else def.getQuickFilterText = ()=> '';
    });
    this.grid.api.onFilterChanged();
    
    调用后,
    quickFilter
    将应用于您的数据网格,不包括
    atternate

    我在ReactJS上为你创建了。 您可以改进选择要依赖于进行筛选的多个列的方式


    我想在您的例子中,您可以尝试从一开始就为
    colDef
    的任一定义添加set
    getQuickFilterText=()=>“”
    ,并让用户启用特定列,您可以将它们的
    getQuickFilterText
    属性设置为未定义,以便在它们之间提供排序。

    我认为这里的问题在于设置更新的列定义。
    你能试试这个吗-

      let newColDef= [];
      this.columns.forEach(column=>{
                if (this.globalSearchSelectedColumns.indexOf(column.field)>-1)
                column.getQuickFilterText = (params)=> params.value.name;
                else column.getQuickFilterText = ()=> '';
    
                newColDef.push(column);
            });
    this.grid.api.setColumnDefs(newColDef);
    this.grid.api.onFilterChanged();
    this.grid.api.resetQuickFilter();
    this.grid.api.refreshHeader();   
    
    Ag grid更新了自v19.1以来检测列变化的方法
    更多细节

    根据文件-->

    设置新列时,网格将与当前列进行比较,并计算出哪些>列是旧列(要删除)、哪些>列是新列(新) 列已创建)或保留(保留的列将保持其状态 包括位置、过滤器和排序)

    列定义的比较在1)对象引用比较和2)上完成 列ID,例如colDef.colId。如果对象 引用匹配,或列ID匹配,然后网格处理 列作为同一列


    Ag网格团队还积极致力于解决v20.1的这个问题。您可以根据nakhodkiin解决方案在

    上跟踪我的代码,如下所示:

      disableFilterCol = () => {
        var col = this.gridColumnApi.getColumn("athlete");
        var colDef = col.getColDef();
        colDef.getQuickFilterText = () => "";
        console.log("disable Athlete");
      };
    
    this.grid.columnApi.getAllColumns().forEach(column=>{
        let def = column.getColDef();
        if (this.globalSearchSelectedColumns.indexOf(def.field)>-1) def.getQuickFilterText = undefined;
        else def.getQuickFilterText = ()=> '';
    });
    this.grid.api.onFilterChanged();
    

    它正在工作

    这个解决方案不起作用,我不想投反对票,但我错投了有用的票,这是不正确的。删除赞成票的唯一方法就是投反对票。很抱歉。