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

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

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

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

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

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


person Brett    schedule 17.01.2017    source источник
comment
Вы пробовали использовать colId?   -  person Jeb50    schedule 23.02.2017


Ответы (18)


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

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

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

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

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

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

person Willy    schedule 27.02.2017
comment
Спасибо и извините за поздний ответ. Вы можете увидеть мой ответ. Это не совсем то, что я хотел, но этого достаточно для того, что мне нужно. - person Brett; 10.03.2017
comment
Это замечательно для обозначения снятого флажка. Как привязать значение к данным узла, это сложно - person aswininayak; 11.06.2019
comment
Решение @ samyak-jain ниже предоставляет полный пример обработки событий. - person Aaron Hudon; 29.08.2019
comment
Пожалуйста, помогите stackoverflow.com/questions/65018177/ - person NeverGiveUp161; 03.12.2020

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

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

А вот и чекбокс CellComponent:

@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;
    }
}

Дайте мне знать

person user2010955    schedule 24.10.2017
comment
Огромное спасибо. Очень больно пытаться решить эту проблему в Angular. - person Jeff Yates; 12.02.2019
comment
Я изменил обработчик onChange на this.params.setValue (event.currentTarget.checked); чтобы вызвать событие gris api - person Simone Bracaloni; 10.06.2020
comment
Это работает, но вам также необходимо определить CellEditor, поэтому, когда пользователи переходят от ячейки к ячейке и переходят к столбцу флажка, они могут использовать пробел для переключения значения, затем Tab для перехода к следующий столбец. Я изо всех сил пытаюсь создать такого зверя, и даже собственный пример agGrid позволяет избежать решения этой проблемы: blog.ag-grid.com/ (Их собственный пример также показывает true или false в режиме редактирования ... это довольно чушь.) - person Mike Gledhill; 26.10.2020

Мы можем использовать cellRenderer для отображения флажка в сетке, который будет работать, когда вы также захотите отредактировать поле. Сетка не будет обновлять значение флажка в gridoption - rowdata напрямую, пока вы не обновите узел соответствующим полем в объекте узла, к которому можно получить доступ с помощью объекта params.

params.node.data.fieldName = params.value;

здесь fieldName - поле строки.

{
    headerName: "display name",
    field: "fieldName",
    cellRenderer: function(params) { 
        var input = document.createElement('input');
        input.type="checkbox";
        input.checked=params.value;
        input.addEventListener('click', function (event) {
            params.value=!params.value;
            params.node.data.fieldName = params.value;
        });
        return input;
    }
}
person Samyak Jain    schedule 14.03.2019
comment
Спасибо. Вы мне очень помогли. - person rom5jp; 11.04.2019

Приведенный ниже код помогает решить проблему. Обратной стороной является то, что обычные события в 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;
  };
person Will    schedule 21.02.2018
comment
Я использую ваше решение сейчас @Will. Интересно, как я могу получить все данные с данными логического редактора. Мне нужно получить все обновленные данные при обновлении моей сетки - person Kle; 09.05.2018
comment
@Kle, вы должны получить то, что хотите, в событии клика input.addEventListener('click', function (event) - person Will; 09.05.2018
comment
пожалуйста, обратитесь к нижеприведенному решению, предоставленному @Willy - person Amit Bisht; 05.07.2018
comment
Чтобы изменить значение столбца, по которому щелкнули мышью, в rowData обычным способом, вы можете использовать следующее после комментария _1 _...: params.data[params.colDef.field] = params.value; - person Ken Burcham; 24.07.2018
comment
Если вам также требуется F2 или Enter для редактирования ячейки, обновите метод BooleanEditor.prototype.init с помощью params.node.setDataValue(params.column, !params.value);, params.stopEditing();, params.api.refreshCells(); - person Ondras; 07.08.2018

Вот как создать средство визуализации ячеек agGrid в Angular, чтобы привязать один из ваших столбцов к флажку.

Этот ответ в значительной степени основан на отличном ответе из ответа user2010955 выше, но с немного большим объяснением и обновлен с последними версиями agGrid и Angular (я получал ошибка с использованием его кода перед добавлением следующих изменений).

И да, я знаю, что этот вопрос касался версии agGrid React, но я уверен, что не буду единственным разработчиком Angular, который наткнется на эту веб-страницу StackOverflow. отчаяния, пытаясь найти угловое решение этой проблемы.

(Между прочим, я не могу поверить, что сейчас 2020 год, а в agGrid для Angular нет средства визуализации флажка, включенного по умолчанию. Серьезно? !!)

Во-первых, вам нужно определить компонент рендерера:

import { Component } from '@angular/core';
import { ICellRendererAngularComp } from 'ag-grid-angular';
import { ICellRendererParams } from 'ag-grid-community';

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

    public params: ICellRendererParams; 

    constructor() { }

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

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

    refresh(params: ICellRendererParams): boolean {
        return true;
    }
}

Затем вам нужно сообщить об этом своему @NgModule:

import { CheckboxCellRenderer } from './cellRenderers/CheckboxCellRenderer';
. . .
@NgModule({
  declarations: [
    AppComponent,
    CheckboxCellRenderer
  ],
  imports: [
    BrowserModule,
    AgGridModule.withComponents([CheckboxCellRenderer])
  ],
  providers: [],
  bootstrap: [AppComponent]
})

В вашем компоненте, который отображает agGrid, вам необходимо импортировать ваше средство визуализации:

import { CheckboxCellRenderer } from './cellRenderers/CheckboxCellRenderer';

Давайте определим новые столбцы для нашей сетки, некоторые из которых будут использовать это новое средство визуализации:

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
    @ViewChild('exampleGrid', {static: false}) agGrid: AgGridAngular;

    columnDefs = [
        { headerName: 'Last name', field: 'lastName', editable: true },
        { headerName: 'First name', field: 'firstName',  editable: true },
        { headerName: 'Subscribed', field: 'subscribed', cellRenderer: 'checkboxCellRenderer' },
        { headerName: 'Is overweight', field: 'overweight', cellRenderer: 'checkboxCellRenderer' }
    ];
    frameworkComponents = {
      checkboxCellRenderer: CheckboxCellRenderer
    }
}

И теперь, когда вы создаете свою agGrid, вам нужно рассказать ей о самодельных компонентах фреймворка, которые вы используете:

<ag-grid-angular #exampleGrid 
    style="height: 400px;" 
    class="ag-theme-material" 
    [rowData]="rowData"
    [columnDefs]="columnDefs" 
    [frameworkComponents]="frameworkComponents" >
</ag-grid-angular>

Уф!

Да ... мне потребовалось время, чтобы придумать, как соединить все части вместе. Собственный веб-сайт agGrid действительно должен был включать такой пример ...

person Mike Gledhill    schedule 23.04.2020
comment
Классный пост. Работает, как ожидалось. Просто следил за всеми битами кодирования для соответствующих файлов. - person gnganapath; 25.05.2020
comment
Безупречный пример для использования с Angular. Вы сэкономили мне как минимум час борьбы. - person brt; 07.01.2021

Реагировать на конкретное решение

При использовании функционального компонента React (16.x) с React Hooks упростите написание вашего cellRenderer. Вот функция, эквивалентная тому, что pnunezcalzado опубликовал ранее.

Компонент React для средства визуализации ячеек

function AgGridCheckbox (props) {
  const boolValue = props.value && props.value.toString() === 'true';
  const [isChecked, setIsChecked] = useState(boolValue);
  const onChanged = () => {
    props.setValue(!isChecked);
    setIsChecked(!isChecked);
  };
  return (
    <div>
      <input type="checkbox" checked={isChecked} onChange={onChanged} />
    </div>
  );
}

Использование его в вашей сетке

Настройте свой столбец def (ColDef), чтобы использовать это средство визуализации ячеек.

{
  headerName: 'My Boolean Field',
  field: 'BOOLFIELD',
  cellRendererFramework: AgGridCheckbox,
  editable: true,
},
person DVM    schedule 24.01.2020

Фреймворки - React / Angular / Vue.js

Вы можете легко интегрировать рендеры ячеек с любой инфраструктурой JavaScript, которую вы используете для рендеринга ag-Grid, создав свои рендеры ячеек как собственные компоненты фреймворка.

Смотрите, как это реализовано в React в сегменте кода ниже:

export default class extends Component {
  constructor(props) {
    super(props);
    this.checkedHandler = this.checkedHandler.bind(this);
  }
  checkedHandler() {
    let checked = event.target.checked;
    let colId = this.props.column.colId;
    this.props.node.setDataValue(colId, checked);
  }
  render() {
    return (
      <input 
        type="checkbox" 
        onClick={this.checkedHandler}
        checked={this.props.value}
      />
    )
  }
}

Примечание. При создании средств визуализации ячеек в качестве компонентов каркаса не требуются методы жизненного цикла.

После создания рендерера мы регистрируем его в ag-Grid в gridOptions.frameworkComponents и определяем его в нужных столбцах:

// ./index.jsx

 this.frameworkComponents = {
   checkboxRenderer: CheckboxCellRenderer,
 };

 this.state = {
      columnDefs: [
        // ...
        {
          headerName: 'Registered - Checkbox',
          field: 'registered',
          cellRenderer: 'checkboxRenderer',
        },
        // ...
      ]
      // ....

См. Ниже живые примеры, реализованные в самых популярных фреймворках JavaScript (React, Angular, Vue.js):

React demo.

Angular demo.
Примечание. При использовании Angular также необходимо передавать пользовательские средства визуализации в декоратор @NgModule, позволяющий внедрять зависимости.

Демонстрация Vue.js.

Ванильный JavaScript

Вы также можете реализовать средство визуализации флажков с помощью JavaScript.

В этом случае средство визуализации флажка создается с использованием класса JavaScript. Элемент ввода создается в методе жизненного цикла ag-Grid init (обязательно), и его атрибуту checked устанавливается базовое логическое значение ячейки, в которой он будет отображаться. Слушатель событий щелчка добавляется к флажку, который обновляет эту базовую ячейку значение всякий раз, когда вход отмечен / не отмечен.

Созданный элемент DOM возвращается в ловушке жизненного цикла getGui (обязательный). Мы также немного подправили destroy дополнительный обработчик жизненного цикла, удалив прослушиватель кликов.

function CheckboxRenderer() {}

CheckboxRenderer.prototype.init = function(params) {
  this.params = params;

  this.eGui = document.createElement('input');
  this.eGui.type = 'checkbox';
  this.eGui.checked = params.value;

  this.checkedHandler = this.checkedHandler.bind(this);
  this.eGui.addEventListener('click', this.checkedHandler);
}

CheckboxRenderer.prototype.checkedHandler = function(e) {
  let checked = e.target.checked;
  let colId = this.params.column.colId;
  this.params.node.setDataValue(colId, checked);
}

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

CheckboxRenderer.prototype.destroy = function(params) {
  this.eGui.removeEventListener('click', this.checkedHandler);
}

После создания нашего рендерера мы просто регистрируем его в ag-Grid в нашем объекте gridOptions.components:

gridOptions.components = {
  checkboxRenderer: CheckboxRenderer
}

И определите средство визуализации в нужном столбце:

gridOptions.columnDefs = [
  // ...
  { 
    headerName: 'Registered - Checkbox',
    field: 'registered',
    cellRenderer: 'checkboxRenderer',
  },
  // ...

Пожалуйста, посмотрите, как это реализовано в демонстрации ниже:

Стандартный JavaScript.

Прочтите полный текст сообщения в блоге на нашем веб-сайте или ознакомьтесь с нашей документацией для самых разных сценариев, которые можно реализовать с помощью ag-Grid.

Ахмед Гадир | Разработчик @ ag-Grid

person ahmedg94    schedule 03.06.2020

Вот версия перехватчиков, установите для этого компонента columnDef.cellEditorFramework.

import React, {useEffect, forwardRef, useImperativeHandle, useRef, useState} from "react";

export default forwardRef((props, ref) => {
    const [value, setValue] = useState();

    if (value !== ! props.value) {
        setValue(!props.value);
    }

    const inputRef = useRef();
    useImperativeHandle(ref, () => {
        return {
            getValue: () => {
                return value;
            }
        };
    });

    const onChange= e => {
        setValue(!value);
    }

    return (<div  style={{paddingLeft: "15px"}}><input type="checkbox" ref={inputRef} defaultChecked={value} onChange={onChange}  /></div>);
})

У меня также есть следующее средство визуализации ячеек, которое приятно

       cellRenderer: params => {
            return `<i class="fa fa-${params.value?"check-":""}square-o" aria-hidden="true"></i>`;
        },
person Marc Dworkin    schedule 15.06.2020
comment
Вы не можете изменить состояние, поэтому выполнение setValue(!value) неверно, вам следует сделать setValue((prev)=>!prev). Я отредактирую ваш ответ, чтобы исправить это - person dracarys; 17.05.2021

В columnDefs добавьте столбец флажка. Не нужно устанавливать для свойства ячейки editable значение 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>);
    }
}
person CS-    schedule 21.04.2017

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

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

function RefundedCellRenderer(params) {
    return params.value;
}
person Community    schedule 31.01.2018

Вы можете использовать логическое значение (истина или ложь)

Я пробую это, и это работает:

var columnDefs = [
  {
    headerName: 'Refunded', 
    field: 'refunded',
    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.refunded = event.newValue; // Update value of field refunded
        }
    },
    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);
    })
});
person Haifahrul    schedule 07.07.2019

Несмотря на то, что это старый вопрос, я разработал решение, которое может быть интересным.

Вы можете создать компонент рендеринга ячеек для флажка, затем примените его к столбцам, которые должны отображать флажок на основе логического значения.

Посмотрите пример ниже:

/*
  CheckboxCellRenderer.js
  Author: Bruno Carvalho da Costa (brunoccst)
*/

/*
 * Function to work as a constructor.
 */
function CheckboxCellRenderer() {}

/**
 * Initializes the cell renderer.
 * @param {any} params Parameters from AG Grid.
 */
CheckboxCellRenderer.prototype.init = function(params) {
  // Create the cell.
  this.eGui = document.createElement('span');
  this.eGui.classList.add("ag-icon");

  var node = params.node;
  var colId = params.column.colId;
  
  // Set the "editable" property to false so it won't open the default cell editor from AG Grid.
  if (params.colDef.editableAux == undefined)
      params.colDef.editableAux = params.colDef.editable;
  params.colDef.editable = false;

  // Configure it accordingly if it is editable.
  if (params.colDef.editableAux) {
    // Set the type of cursor.
    this.eGui.style["cursor"] = "pointer";

    // Add the event listener to the checkbox.
    function toggle() {
      var currentValue = node.data[colId];
      node.setDataValue(colId, !currentValue);

      // TODO: Delete this log.
      console.log(node.data);
    }
    this.eGui.addEventListener("click", toggle);
  }

  // Set if the checkbox is checked.
  this.refresh(params);
};

/**
 * Returns the GUI.
 */
CheckboxCellRenderer.prototype.getGui = function() {
  return this.eGui;
};

/**
 * Refreshes the element according to the current data.
 * @param {any} params Parameters from AG Grid.
 */
CheckboxCellRenderer.prototype.refresh = function(params) {
  var checkedClass = "ag-icon-checkbox-checked";
  var uncheckedClass = "ag-icon-checkbox-unchecked";

  // Add or remove the classes according to the value.
  if (params.value) {
    this.eGui.classList.remove(uncheckedClass);
    this.eGui.classList.add(checkedClass);
  } else {
    this.eGui.classList.remove(checkedClass);
    this.eGui.classList.add(uncheckedClass);
  }

  // Return true to tell the grid we refreshed successfully
  return true;
}

/*
  The code below does not belong to the CheckboxCellRenderer.js anymore.
  It is the main JS that creates the AG Grid instance and structure.
*/

// specify the columns
var columnDefs = [{
  headerName: "Make",
  field: "make"
}, {
  headerName: "Model",
  field: "model"
}, {
  headerName: "Price",
  field: "price"
}, {
  headerName: "In wishlist (editable)",
  field: "InWishlist",
  cellRenderer: CheckboxCellRenderer
}, {
  headerName: "In wishlist (not editable)",
  field: "InWishlist",
  cellRenderer: CheckboxCellRenderer,
  editable: false
}];

// specify the data
var rowData = [{
  make: "Toyota",
  model: "Celica",
  price: 35000,
  InWishlist: true
}, {
  make: "Toyota 2",
  model: "Celica 2",
  price: 36000,
  InWishlist: false
}];

// let the grid know which columns and what data to use
var gridOptions = {
  columnDefs: columnDefs,
  defaultColDef: {
    editable: true
  },
  rowData: rowData,
  onGridReady: function() {
    gridOptions.api.sizeColumnsToFit();
  }
};

// wait for the document to be loaded, otherwise
// ag-Grid will not find the div in the document.
document.addEventListener("DOMContentLoaded", function() {
  // lookup the container we want the Grid to use
  var eGridDiv = document.querySelector('#myGrid');

  // create the grid passing in the div to use together with the columns & data we want to use
  new agGrid.Grid(eGridDiv, gridOptions);
});
<!DOCTYPE html>
<html>

<head>
  <script src="https://unpkg.com/ag-grid/dist/ag-grid.js"></script>
</head>

<body>
  <div id="myGrid" style="height: 115px;" class="ag-fresh"></div>
</body>

</html>

Обратите внимание, что мне нужно было отключить свойство editable перед завершением функции init, иначе AG Grid отобразит редактор ячеек по умолчанию для поля, что будет иметь странное поведение.

person brunoccst    schedule 02.03.2020

Логические данные в настоящей части:

    function booleanCellRenderer(params) { 
        var valueCleaned = params.value;
        if (valueCleaned === 'T') {
            return '<input type="checkbox" checked/>';
        } else if (valueCleaned === 'F') {
            return '<input type="checkbox" unchecked/>';
        } else if (params.value !== null && params.value !== undefined) {
            return params.value.toString();
        } else {
            return null;
        }
    }

    var gridOptions = { 
        ...
        components: {
            booleanCellRenderer: booleanCellRenderer,
        }
    };

    gridOptions.api.setColumnDefs(
      colDefs.concat(JSON.parse('[{"headerName":"Name","field":"Field", 
        "cellRenderer": "booleanCellRenderer"}]')));
person Song    schedule 04.03.2019

Вот решение, которое сработало для меня. Для решения проблем с контекстом обязательно соблюдать функции стрелок.

Составная часть:

import React from "react";

class AgGridCheckbox extends React.Component {

  state = {isChecked: false};

  componentDidMount() {
    let boolValue = this.props.value.toString() === "true";
    this.setState({isChecked: boolValue});
  }

  onChanged = () => {
    const checked = !this.state.isChecked;
    this.setState({isChecked: checked});
    this.props.setValue(checked);
  };

  render() {
    return (
      <div>
        <input type={"checkbox"} checked={this.state.isChecked} onChange={this.onChanged}/>
      </div>
    );
  }
}

export default AgGridCheckbox;

Объект определения столбца внутри массива columnDefs:

{
  headerName: "yourHeaderName",
  field: "yourPropertyNameInsideDataObject",
  cellRendererFramework: AgGridCheckbox
}

JSX вызывает ag-grid:

<div
    className="ag-theme-balham"
  >
    <AgGridReact
      defaultColDef={defaultColDefs}
      columnDefs={columnDefs}
      rowData={data}
    />
</div>
person pnunezcalzado    schedule 18.01.2020

Я нашел хороший онлайн-пример для этой функции:

https://stackblitz.com/edit/ag-grid-checkbox?embed=1&file=app/ag-grid-checkbox/ag-grid-checkbox.component.html

Базовые знания основаны на cellRendererFramework: https://www.ag-grid.com/javascript-grid-components/

person Xin Meng    schedule 28.02.2020

Вы можете оставить флажок на дисплее и отредактировать его следующим образом:

headerName: 'header name',
field: 'field',
filter: 'agTextColumnFilter',
cellRenderer: params => this.checkBoxCellEditRenderer(params),

А затем создайте рендерер:

checkBoxCellEditRenderer(params) {
   const input = document.createElement('input');
   input.type = 'checkbox';
   input.checked = params.value;
   input.addEventListener('click', () => {
      params.value = !params.value;
      params.node.data[params.coldDef.field] = params.value;
      // you can add here code

    });
      return input;
}
person dreamer    schedule 16.06.2020

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

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

function RefundedCellRenderer(params) {
    return params.value;
}
person Brett    schedule 10.03.2017

person    schedule
comment
Хотя этот фрагмент кода может быть решением, включая объяснение действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причины вашего предложения кода. - person Ardent Coder; 06.05.2020