AG-GRID : Infinite loop between onRowSelected and setSelected

Viewed 2378

I'm trying to select some rows depending on if i select or deselect a row, if i select a row, the rows with the index lower than the index of the selected row, will be slected too. The problem that i have is that each time the setSelected(true) or setSelected(false) is executed, the onRowSelected event is triggered again, and it becomes an infinite loop.

this.gridOptions.onRowSelected = function(event) {
    var rowIndexSelected = event.rowIndex;
    if (event.node.selected) {
        vm.gridOptionsSuiviPrestataire.api.forEachNode(function(rowNode, index) {
            if (index < rowIndexSelected) {
                rowNode.setSelected(true);
            }
        });             
    } else {
        vm.gridOptionsSuiviPrestataire.api.forEachNode(function(rowNode, index) {
            if (index > rowIndexSelected) {
                rowNode.setSelected(true);
            }
        }); 
    }
};

Is there a way to do this without triggering the onRowSelected event listener or to use some flag to prevent executing the code inside of the method ?

2 Answers

node.setSelected has a third parameter called suppressFinishActions but currently it only suppresses onSelectionChanged event. This is a limitation for which ag-Grid has two items in the backlog (AG-2859 and AG-2707). I'm not sure when they will provide the fix.

For now you could try doing node.selected = true but I've noticed that rows selected in this way don't have a highlight which is added via manual selection or setSelected.

Hope this will help you.

let rowSelected = false;

this.gridOptions.onRowSelected = function (event) {

  if (rowSelected) {
    return;
  }

  var rowIndexSelected = event.rowIndex;
  if (event.node.selected) {
    vm.gridOptions.api.forEachNode(function (rowNode, index) {
      if (index < rowIndexSelected) {
        rowSelected = true;
        rowNode.setSelected(true);

      }
    });
  } else {
    vm.gridOptions.api.forEachNode(function (rowNode, index) {
      if (index > rowIndexSelected) {
        rowSelected = true;
        rowNode.setSelected(true);
      }
    });
  }

  rowSelected = false;
};
Related