Как изменить цвет ячеек ag-grid для динамически изменяющихся данных

У меня есть таблица, которая загружается из динамически изменяющихся данных. Обновляется каждые 5 секунд. Я использую для этого ag-grid, используя этот пример: https://www.ag-grid.com/javascript-grid-sorting/index.php

Можно ли изменить цвет ячеек, значения которых изменились, например, предположим, что значение ячейки равно 100, и оно становится (меньше, чем это, то есть <100), поэтому сделайте ячейку красным цветом, id она станет больше, сделайте ее зеленым цветом. Я пытаюсь сделать это, используя этот пример: https://www.ag-grid.com/javascript-grid-cell-styling/index.php

Но я не понимаю, как это сделать.

ОБНОВЛЕНИЕ: я делаю это так, но не меняю цвет:

var columnDefs = [
    {headerName: "Arr Px Slippage", field: "total_wt_arr_slp", width: 100, newValueHandler: compareValues},
    {headerName: "IVWAP Slippage", field: "total_wt_ivwap_slp", width: 100}


];

function compareValues(params) {
    if (params.oldValue > params.newValue){ 
    return {color: 'green', backgroundColor: 'black'};
    console.log(params.newValue);

    }
    if (params.oldValue < params.newValue){ 
    return {color: 'red', backgroundColor: 'black'};
    }
}

person shek    schedule 22.09.2016    source источник
comment
Если вы видите, в документах ag-grid есть страница для обновления (ag-grid. com / javascript-grid-refresh). Второй пример - это то, что вы можете посмотреть. Цвет значения в столбце «Итого» изменяется, если значение больше 20, в зависимости от суммы других столбцов в строке. Проблема, которую я не могу решить, заключается в том, как классы применяются динамически.   -  person jsmtslch    schedule 04.11.2016


Ответы (4)


На самом деле я только что заработал. Вам нужен атрибут cellClassRules для каждого столбца, цвет которого вы хотите изменить. Что-то вроде:

{headerName: "header", field:"field",suppressMenu: true, volatile: true, suppressMovable: true, cellClassRules: {'bold-and-red': 'x>1'} }

Здесь «x» в правиле - это значение столбца. Кроме того, вам необходимо пометить свой столбец как voaltile: true.
Для динамического изменения изменчивых полей вам понадобится api.softRefreshView() во время обновления данных.
Класс css, выделенный жирным и красным, может быть определен в ваш файл HTML, например: .bold-and-red {color: darkred; font-weight: жирный; }

person jsmtslch    schedule 04.11.2016
comment
Это хороший ответ, за исключением того факта, что softRefreshView() устарел, поэтому я использовал .refreshCells() - person MFARID; 30.04.2019

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

 var colDef = {
            name: 'Dynamic Styles',
            field' 'dummyfield',
            cellStyle: function(params) {
                if (params.node.value=='Police') {
        //Here you can check the value and based on that you can change the color
                    //mark police cells as red
                    return {color: 'red', backgroundColor: 'green'};
                } else {
                    return null;
                }
            }
        }
person Rajanikanta Pradhan    schedule 24.05.2018

То, что вы написали, в основном правильно:

function compareValues(params) {
if (params.oldValue > params.newValue){ 
return {color: 'green', backgroundColor: 'black'};
console.log(params.newValue);

}
if (params.oldValue < params.newValue){ 
return {color: 'red', backgroundColor: 'black'};
}

И информация, которую Джарод Мозер дал вам об объекте params для этого обратного вызова, точна и важна.

Проблема в том, что вы пытаетесь return {style}, но не можете этого сделать. Вам необходимо иметь доступ к элементу html (содержащему <div>) и установить для него класс (с определением класса с желаемым стилем). Я сделал это в ag-grid, где у меня есть доступ к params.eGridCell, но в этом конкретном обратном вызове eGridCell недоступен. Если я найду хороший способ добраться до <div>, я отредактирую этот пост, используя то, что я нашел.

ИЗМЕНИТЬ - Дополнительная информация

Я не думаю, что буду использовать newValueHandler для того, что вы пытаетесь сделать.

Вы не говорите, как вы обновляете данные, но вы говорите, что они, возможно, обновляются каждые 5 секунд.

Однако вы решаете обновить ячейку, вы можете добавить к объекту rowData свойство origValue и перед обновлением значения ячейки установить текущее значение как origValue, а затем установить новое значение как value. THEN ... вы можете использовать свойство столбца cellClass, используя функцию обратного вызова, и сравнить новое значение с 'origValue' и вернуть желаемый стиль.

Примеры из документации:

// return class based on function
var colDef3 = {
    name: 'Function Returns String',
    field' 'field3',
    cellClass: function(params) { return (params.value==='something'?'my-class-1':'my-class-2'); }
}


// return array of classes based on function
var colDef4 = {
    name: 'Function Returns Array',
    field' 'field4',
    cellClass: function(params) { return ['my-class-1','my-class-2']; }
}

Объект params для cellClass имеет доступ к данным строки и может сравнивать новое и исходное значения.

Когда вы начнете копать, у вас будет много вариантов. Выбирайте то, что считаете лучшим.

person JohnR    schedule 18.10.2016

Похоже, вы сможете использовать newValueHandler который является атрибутом каждого столбца.

Из документов:

Если вы хотите использовать простое редактирование текста, но хотите каким-то образом отформатировать результат перед вставкой в ​​строку, вы можете предоставить столбцу newValueHandler. Это позволит вам добавить к значению дополнительную проверку или диалог.

newValueHandler предоставляется объект params с атрибутами:

  • узел: рассматриваемый узел сетки.
  • data: данные строки, о которых идет речь.
  • oldValue: если «поле» находится в определении столбца, содержит значение в данных до редактирования.
  • newValue: строковое значение, введенное в редактор по умолчанию.
  • rowIndex: индекс виртуализированной строки.
  • colDef: определение столбца.
  • context: контекст, установленный в gridOptions. api: ссылка на ag-Grid API.

Так что что-то вроде:

var colDefs = [{
    header: 'comparing to previous val'
    newValueHandler: compareValues
}]

function compareValues(params){
    if (params.oldValue > params.newValue){ //make it red}
    if (params.oldValue < params.newValue){ //make it green}
}
person Jarod Moser    schedule 22.09.2016
comment
Привет, пожалуйста, посмотрите мой обновленный вопрос. Я сделал, как вы сказали, но это не работает. - person shek; 23.09.2016
comment
Вы пробовали использовать cellValueChanged вместо newValueHandler? это было на той же странице, которую я связал с вами для вашей справки. - person Jarod Moser; 26.09.2016
comment
Как их использовать? В приведенной вами ссылке нет примера с использованием newValueHandler или CellValueChanged. - person shek; 26.09.2016
comment
Честно говоря, я думаю, что вы ищете какую-то функциональность, реализация которой будет более сложной, чем та, которую вы готовы вложить. То, что вы ищете, похоже, похоже на то, что делает эта сетка < / а>. - person Jarod Moser; 26.09.2016
comment
Да, я хочу сделать что-то подобное. Значит, с помощью ag-grid этого нельзя сделать? - person shek; 26.09.2016
comment
Также, если я сделаю что-то вроде этого: {headerName: Something, field: total_wt_ivwap_slp, width: 100, cellStyle: function (params) {if (params.value ›0) {return {color: 'green', fontWeight: 'bold' }; } else {if (params.value ‹0) {return {цвет: 'красный', fontWeight: 'жирный'}; } } } } оно работает! Но params.newValue или oldValue не работают. - person shek; 26.09.2016
comment
1. Я говорю о том, что ag-grid может делать все, что вы хотите, но это потребует больше усилий, чем то, что вы кажется хотели бы вложить в него со своей стороны. Я также говорю, что если вам нужна определенная функциональность из фреймворка / инструмента, найдите фреймворк / инструмент, в котором эта функциональность изначально встроена. - person Jarod Moser; 26.09.2016
comment
2 - Если вы уже нашли что-то, что работает ... тогда зачем вам публиковать вопрос о переполнении стека? - person Jarod Moser; 26.09.2016