Как использовать флажок для логических данных с ag-grid

Я искал некоторое время и не видел никакого реального примера этого.

Я использую ag-grid-react, и я хотел бы, чтобы столбец, содержащий логическое значение, представлял это логическое значение с флажком и обновлял объект в rowData при изменении.

Я знаю, что есть checkboxSelection, и я попытался использовать его, как то, что у меня ниже, но понял, что, хотя это флажок, он не связан с данными и просто для выбора ячейки.

var columnDefs = [
        { headerName: 'Refunded', field: 'refunded', checkboxSelection: true,}
  ]

Так есть ли способ сделать то, что я ищу, с ag-grid и ag-grid-react?

6 ответов


вы должны использовать свойство cellRenderer

const columnDefs = [{ headerName: 'Refunded', 
    field: 'refunded', 
    editable:true,
    cellRenderer: params => {
        return `<input type='checkbox' ${params.value ? 'checked' : ''} />`;
    }
}];

Я застрял в той же проблеме , это лучшее, что я мог придумать, но я не смог привязать значение к этому флажку.

Я установил свойство ячейки, редактируемое в true, теперь, если вы хотите изменить фактическое значение, вам нужно дважды щелкнуть ячейку и ввести true или false.

но это так далеко, как я пошел, и я решил помочь вам, я знаю, что это не 100% решить все, но, по крайней мере, он решил часть представления данных.

Если вы узнали, как, пожалуйста, поделитесь своими ответами с нами.


приведенный ниже код помогает решить проблему. Недостатком является то, что нормальные события в gridOptions не будут запущены (onCellEditingStarted,onCellEditingStopped, onCellValueChanged и т. д.).

var columnDefs = [...
           {headerName: "Label", field: "field",editable: true,
                cellRenderer: 'booleanCellRenderer',
                cellEditor:'booleanEditor'

            }
        ];
//register the components
$scope.gridOptions = {...
                components:{
                    booleanCellRenderer:BooleanCellRenderer,
                    booleanEditor:BooleanEditor
                }
            }; 

  function BooleanCellRenderer() {
  }

  BooleanCellRenderer.prototype.init = function (params) {
      this.eGui = document.createElement('span');
      if (params.value !== "" || params.value !== undefined || params.value !== null) {
          var checkedStatus = params.value ? "checked":"";
          var input = document.createElement('input');
          input.type="checkbox";
          input.checked=params.value;
          input.addEventListener('click', function (event) {
              params.value=!params.value;
              //checked input value has changed, perform your update here
              console.log("addEventListener params.value: "+ params.value);
          });
          this.eGui.innerHTML = '';
          this.eGui.appendChild( input );
      }
  };

  BooleanCellRenderer.prototype.getGui = function () {
      return this.eGui;
  };

  function BooleanEditor() {
  }

  BooleanEditor.prototype.init = function (params) {
      this.container = document.createElement('div');
      this.value=params.value;
      params.stopEditing();
  };
  BooleanEditor.prototype.getGui = function () {
      return this.container;
  };

  BooleanEditor.prototype.afterGuiAttached = function () {
  };

  BooleanEditor.prototype.getValue = function () {
      return this.value;
  };

  BooleanEditor.prototype.destroy = function () {
  };

  BooleanEditor.prototype.isPopup = function () {
      return true;
  };

Как насчет этого? Это на угловом, а не на React, но вы можете получить точку:

        { headerName: 'Enabled', field: 'enabled', cellRendererFramework: CheckboxCellComponent },

и вот checkboxCellComponent:

@Component({
selector: 'checkbox-cell',
template: `<input type="checkbox" [checked]="params.value" (change)="onChange($event)">`,
styleUrls: ['./checkbox-cell.component.css']
}) 
export class CheckboxCellComponent implements AfterViewInit, 
ICellRendererAngularComp {

@ViewChild('.checkbox') checkbox: ElementRef;

public params: ICellRendererParams;

constructor() { }

agInit(params: ICellRendererParams): void {
  this.params = params;
}

public onChange(event) {
  this.params.data[this.params.colDef.field] = event.currentTarget.checked;
  }
}

Я знаю


в columnDefs добавьте столбец флажка. Не нужно устанавливать для свойства ячейки значение true

columnDefs: [ { headerName: '', field: 'checkbox', cellRendererFramework: CheckboxRenderer, width:30}, ...]

CheckboxRenderer

export class CheckboxRenderer extends React.Component{
    constructor(props) {
        super(props);
        this.state={
            value:props.value
        };
        this.handleCheckboxChange=this.handleCheckboxChange.bind(this);
    }

    handleCheckboxChange(event) {
        this.props.data.checkbox=!this.props.data.checkbox;
        this.setState({value: this.props.data.checkbox});
    }

    render() {
        return (    
        <Checkbox
            checked={this.state.value}
            onChange={this.handleCheckboxChange}></Checkbox>);
    }
}

массив строковых значений не работает для меня,но массив [true, false] работает.

{
    headerName: 'Refunded',
    field: 'refunded',
    cellEditor: 'popupSelect',
    cellEditorParams: {
        cellRenderer: RefundedCellRenderer,
        values: [true, false]
    }
},

function RefundedCellRenderer(params) {
    return params.value;
}

Итак, в конце концов я получил то, что хотел, но немного по-другому, я использовал popupSelect и cellEditorParams со значениями: ['true', 'false']. Конечно, у меня нет фактического флажка, как я хотел, но он ведет себя достаточно хорошо для того, что мне нужно

{
    headerName: 'Refunded', 
    field: 'refunded',
    cellEditor: 'popupSelect',
    cellEditorParams: {
        cellRenderer: RefundedCellRenderer,
        values: ['true', 'false']
    }
},

function RefundedCellRenderer(params) {
    return params.value;
}