【问题标题】:ag-grid cell level checkbox selectag-grid 单元格级别复选框选择
【发布时间】:2018-07-01 05:22:43
【问题描述】:

我想显示所有行,所有带有复选框的列,因为我只想要真/假值。但我想访问单个单元格值,即每个复选框都可以选中/取消选中。见下图。

据我所知,当我勾选复选框时,行的所有复选框都会被选中。那么,我可以选中/取消选中单个框吗?

【问题讨论】:

    标签: select checkbox ag-grid


    【解决方案1】:

    我今天也试图找出它是如何工作的。我可以发现,最好的方法是创建一个新组件并使用cellRendererFramework 而不是cellRenderer

    这里有一个 StackBlitz 示例:

    Stackblitz example Checkbox in ag-grid

    *更新了 Stackblitz 示例以展示如何更新底层模型!谢谢你的提示!

    【讨论】:

    • 我对此感到非常兴奋,但是 -- 它不会更新底层模型 -- 即 {cbox: true, 无限期地保持真实。
    • 抱歉我迟到的回复。您可以使用以下代码轻松修复它refresh(params: any): boolean { params.data.amount++; params.data.cbox = params.value; console.log(params.value); params.api.refreshCells(params); return false; }
    • 有没有办法在上面的例子中,我可以在标题中添加一个复选框来只选择该特定列的单元格?
    • 错误,是的。但是,当您处于编辑模式(编辑包含文本的第二列)并按 Tab 键时,它会完全跳过复选框列。我们如何解决这个问题?
    【解决方案2】:
          {
          headerName: 'Operator',
          checkboxSelection: false,
          headerCheckboxSelection: false,
          filter: false,
          sortable: false,
          field: 'operator',
          cellRenderer: function(params) {
            let operatorValue = params.value;
            const input = document.createElement('input');
            input.type = 'checkbox';
            if (operatorValue) {
                input.checked = true;
                params.data.operator = true;
            } else {
                input.checked = false;
                params.data.operator = false;
            }
            input.addEventListener('click', function (event) {
              input.checked != input.checked;
              params.data.operator  = input.checked;
            });
            return input;
        }
        }
    

    希望这将有助于演示和设置价值。

    【讨论】:

      【解决方案3】:

      听起来您在每一列中都使用了checkboxSelection 选项,这肯定会导致您描述的行为。相反,您将希望使用cellRenderer,就像在这个plunker 中一样。

      相关代码:

      function checkboxCellRenderer (params){
        var input = document.createElement("input")
        input.type = "checkbox";
        input.checked = params.value
        console.log(input)
        return input
      }
      

      只需在您的数据列中引用此函数即可:

      {headerName: 'upload', field: 'e', cellRenderer: checkboxCellRenderer},
      

      【讨论】:

      • 是的。我最终创建了 cellRenderer。我用的是angular2,所以不能用上面的代码
      • 如何获取单元格值?
      【解决方案4】:

      您可以使用布尔值(真或假)

      我试试这个,它的工作:

      var columnDefs = [
        {
          headerName: 'Operator', 
          field: 'operator',
          editable: true,
          cellEditor: 'booleanEditor',
          cellRenderer: booleanCellRenderer
        },
      ];
      

      功能复选框编辑器

      function getBooleanEditor() {
          // function to act as a class
          function BooleanEditor() {}
      
          // gets called once before the renderer is used
          BooleanEditor.prototype.init = function(params) {
              // create the cell
              var value = params.value;
      
              this.eInput = document.createElement('input');
              this.eInput.type = 'checkbox'; 
              this.eInput.checked = value;
              this.eInput.value = value;
          };
      
          // gets called once when grid ready to insert the element
          BooleanEditor.prototype.getGui = function() {
              return this.eInput;
          };
      
          // focus and select can be done after the gui is attached
          BooleanEditor.prototype.afterGuiAttached = function() {
              this.eInput.focus();
              this.eInput.select();
          };
      
          // returns the new value after editing
          BooleanEditor.prototype.getValue = function() {
              return this.eInput.checked;
          };
      
          // any cleanup we need to be done here
          BooleanEditor.prototype.destroy = function() {
              // but this example is simple, no cleanup, we could
              // even leave this method out as it's optional
          };
      
          // if true, then this editor will appear in a popup
          BooleanEditor.prototype.isPopup = function() {
              // and we could leave this method out also, false is the default
              return false;
          };
      
          return BooleanEditor;
      }
      

      然后是 booleanCellRenderer 函数

      function booleanCellRenderer(params) {
          var value = params.value ? 'checked' : 'unchecked';
      
          return '<input disabled type="checkbox" '+ value +'/>';
      }
      

      让网格知道要使用哪些列和哪些数据

      var gridOptions = {
          columnDefs: columnDefs,
          pagination: true,
          defaultColDef: {
              filter: true,
              resizable: true,
          },
          onGridReady: function(params) {
              params.api.sizeColumnsToFit();
          },
          onCellValueChanged: function(event) {
              if (event.newValue != event.oldValue) { 
                  // do stuff
                  // such hit your API update
                  event.data.operator = event.newValue; // Update value of field operator
              }
          },
          components:{
              booleanCellRenderer: booleanCellRenderer,
              booleanEditor: getBooleanEditor()
          }
      };
      

      页面加载完成后设置网格

      document.addEventListener('DOMContentLoaded', function() {
          var gridDiv = document.querySelector('#myGrid');
          // create the grid passing in the div to use together with the columns & data we want to use
          new agGrid.Grid(gridDiv, gridOptions);
      
          fetch('$urlGetData').then(function(response) {
              return response.json();
          }).then(function(data) {
              gridOptions.api.setRowData(data);
          })
      });
      

      【讨论】:

        【解决方案5】:

        fwiw -- 他们终于发布了一个工作示例:

        https://www.ag-grid.com/example-angular-material-design/

        如果您将材料复选框更改为常规输入复选框,它会按预期工作。

        【讨论】:

          猜你喜欢
          • 2021-10-21
          • 2023-01-26
          • 1970-01-01
          • 2016-01-21
          • 2021-12-29
          • 2019-07-29
          • 2018-09-18
          • 2018-05-20
          • 2019-04-22
          相关资源
          最近更新 更多