AG-Grid: updateRowData ({update: ItemsArray}) влияет на все строки вместо выбранных строк

Я использую Ag-Grid и Angular для этого проекта, и то, что я пытаюсь сделать, - это настроить сочетания клавиш для изменения значения «Статус» выбранных строк, нажав соответствующие клавиши ('1' = 'статус завершен', так далее.). Существует встроенная функция onCellKeyPress(), которая отслеживает нажатия клавиш после выбора строки или строк. Это отлично работает, у меня есть корпус переключателя, который отправляет значение в зависимости от того, какая клавиша нажата, например:

  onCellKeyPress = (e: any) => {
    switch(e.event.key) {
      case '0': this.rowUpdates('New'); break;
      case '1': this.rowUpdates('Completed'); break;
      case '2': this.rowUpdates('Needs Attention'); break;
      case '3': this.rowUpdates('Rejected'); break;
    }
  }

Он отправляет строку моей пользовательской функции rowUpdates(), которая принимает значение, проходит через существующие узлы, ищет все, что выбрано, устанавливает значение для выбранных и помещает их в массив.

Теперь вот где начинаются проблемы. updateRowData принимает 2 параметра, первый - это тип выполняемого обновления (добавление, удаление, обновление), в моем случае я использую последний и массив строк для изменения.

  rowUpdates = (value: String) => {
    let itemsToUpdate = [];
    this.gridOptions.api.forEachNode(rowNode => {
      if(rowNode.isSelected() === true) {
        const selected = rowNode.data;
        selected.status.name = value;
        itemsToUpdate.push(selected);
        console.log(itemsToUpdate);
      }
    });
    this.gridOptions.api.updateRowData({update: itemsToUpdate});
  }

Однако, когда я нажимаю клавишу, чтобы изменить значение строки, она обновляет каждую строку в моей сетке. Что еще более странно, так это то, что у меня есть метод, который добавляет класс в строку в зависимости от значения «Статус», и только строки, которые я намеревался изменить, получают этот класс.

Я в тупике. Я console.locked все в этой функции, и все они возвращаются с их предполагаемыми значениями. Массив всегда содержит выбранные узлы, и возвращаемое значение updateRowData всегда является тем же самым массивом. Я пробовал отключить forEachNode с getSelectedNodes и getSelectedRows, но безрезультатно. Любые идеи?


person Tasha Zuniga    schedule 02.05.2019    source источник
comment
Убедитесь, что вы используете модель строки на стороне клиента, поскольку другие модели (например, на стороне сервера или бесконечная строка) не поддерживают обновления транзакций. Также распечатайте данные, возвращенные вызовом updateRowData. Это может помочь.   -  person Chris    schedule 03.05.2019
comment
Документы говорят мне, что модель строк на стороне клиента является настройкой по умолчанию, и я явно не менял ее. Я попытался добавить функцию печати согласно примеру в разделе «Обновление данных», но безрезультатно. Спасибо за идеи!   -  person Tasha Zuniga    schedule 03.05.2019
comment
Обратите внимание, что документ (ag-grid.com/javascript- grid-data-update / # update-rows) состояния За кулисами сетка будет вызывать rowNode.setRowData (newData). Но setRowData обновляет всю сетку. Это смущает.   -  person Chris    schedule 03.05.2019


Ответы (1)


Пожалуйста, попробуйте это.

updateItems(value: String) {
    var itemsToUpdate = [];
    this.gridApi.forEachNodeAfterFilterAndSort(function(rowNode, index) {
      if (!rowNode.selected) {
        return;
      }
      var data = rowNode.data;
      data.status.name = value;
      itemsToUpdate.push(data);
    });
    var res = this.gridApi.updateRowData({ update: itemsToUpdate });
    this.gridApi.deselectAll();//optional
  }
person jayadev    schedule 22.04.2020
comment
Вам необходимо задать вопрос, связанный с вашим кодом. Так что, пожалуйста, не могли бы вы указать проблему, на которую ссылается ваш код? - person Alexius DIAKOGIANNIS; 23.04.2020
comment
когда я нажимаю клавишу, чтобы изменить значение строки, он обновляет каждую строку в моей сетке Fix, чтобы обновить только выбранную строку. - person jayadev; 30.07.2020