AG-Grid:根据条件在网格中显示某些“动作”按钮

Posted

技术标签:

【中文标题】AG-Grid:根据条件在网格中显示某些“动作”按钮【英文标题】:AG-Grid: show certain "action" buttons in grid depending on condition 【发布时间】:2019-03-16 04:29:23 【问题描述】:

我在我的 Angular 6 应用程序中使用社区版的“AG Grid”。

我现在面临的挑战是:我有一个相当简单的数据结构,其中的列表绑定到网格以进行显示。根据它的值,我想在网格中添加一个“Actions”列,让用户可以访问某些操作,例如删除一个条目,“提升”它等等。

对于单独的数据绑定列,我得到每行绑定时的相应数据值,例如,我可以使用 单元格渲染器 格式化显示。我希望我能够用我的“动作”列(它不绑定到类的特定数据元素)做类似的事情——但似乎我的“动作单元渲染器”没有任何基础其决定。

我有一个类似这样的数据结构:

export interface Indicator 
    Id: string;
    Name: string;
    IsGlobal: boolean;

这些Indicators 的数组被绑定到我的Angular 组件的OnInit 函数中的AG 网格。

我将 AG 网格的列定义为:

columnDefs = [
     headerName: 'Name', field: 'Name', width: 200, editable: true ,
     headerName: 'Global', field: 'IsGlobal', editable: false, width: 100,
      cellRenderer: (data) =>  
        // here, "data" refers to the "IsGlobal" value of the row being displayed
        if (data.value === true) 
          return 'Ja';
         else 
          return 'Nein';
        
      ,
    ,
     headerName: 'Actions', width: 125,
        cellRenderer: (data) => 
            // here, I was hoping the "data" would refer to the entire
            // row / object being bound, so that I could check for 
            // certain conditions to be true (or false)
            if (data.IsGlobal.value === true) 
            
                return '<span class="far fa-trash-alt mr-2" title="Delete entry"></span>' +
                       '<span class="fab fa-nintendo-switch" title="Promote entry"></span>';
                  
            else
            
                return '<span class="far fa-trash-alt mr-2" title="Delete"></span>';
            
        
    
  ];

我希望能够在我的列定义中定义我的操作列显示一个“提升条目”按钮仅当当前有问题的行的数据具有IsGlobal = false。我希望传递给单元格渲染器的data 将是整个行数据对象(Indicator 类型) - 但情况似乎并非如此。

如何决定在我的列定义中的“操作”列中显示哪些图标?

【问题讨论】:

【参考方案1】:

cellRenderer - 你会得到params 代表一个对象的值:

interface ICellRendererParams 
    value: any, // value to be rendered
    valueFormatted: any, // value to be rendered formatted
    getValue: ()=> any, // convenience function to get most recent up to date value
    setValue: (value: any) => void, // convenience to set the value
    formatValue: (value: any) => any, // convenience to format a value using the columns formatter
    data: any, // the rows data
    node: RowNode, // row rows row node
    colDef: ColDef, // the cells column definition
    column: Column, // the cells column
    rowIndex: number, // the current index of the row (this changes after filter and sort)
    api: GridApi, // the grid API
    eGridCell: htmlElement, // the grid's cell, a DOM div element
    eParentOfValue: HTMLElement, // the parent DOM item for the cell renderer, same as eGridCell unless using checkbox selection
    columnApi: ColumnApi, // grid column API
    context: any, // the grid's context
    refreshCell: ()=>void // convenience function to refresh the cell

所以要访问row-data,您需要使用params.dataparams.node.data

cellRenderer: (params) => 
    if (params.data.IsGlobal.value === true) 
    
        ...
          
    else
    
        ...
    

但请记住,当您将使用内联 cellRenderer - 您可以只实现 HTML 模板(无逻辑),对于逻辑处理,您需要创建自定义cellRenderer 将包含所需的功能等。

您将无法通过 cellRenderer 内联实现来执行 component 函数

【讨论】:

作为 ag-grid 的工作人员,我可以说这是正确的答案 ;) 谢谢!

以上是关于AG-Grid:根据条件在网格中显示某些“动作”按钮的主要内容,如果未能解决你的问题,请参考以下文章

即使使用 css 网格布局设置了高度,ag-grid JS 也没有显示

在两个单独的 ag-Grid 上使用 ag-Grid 的 sizeColumnsToFit() 时警告“网格零宽度”,由选项卡菜单显示

我想根据条件在 ag-grid 中选择行(复选框)

Ag-grid 自定义工具提示不适用于网格单元

如何在角度的 ag-grid 单元格中应用自定义 css 类?

如何在 ag-grid 中捕获行悬停事件?