Frontmatter
| id | 9002 |
| title | Fix Grid Row Cell Pooling Move Operations (Regression) |
| state | Closed |
| labels | bugregressionperformance |
| assignees | tobiu |
| createdAt | Feb 5, 2026, 12:18 PM |
| updatedAt | Feb 5, 2026, 12:47 PM |
| githubUrl | https://github.com/neomjs/neo/issues/9002 |
| author | tobiu |
| commentsCount | 1 |
| parentIssue | null |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Feb 5, 2026, 12:47 PM |
Fix Grid Row Cell Pooling Move Operations (Regression)
tobiu assigned to @tobiu on Feb 5, 2026, 12:19 PM

tobiu
Feb 5, 2026, 12:46 PM
Input from Gemini 3 Pro:
✦ I have implemented the "Full Pool Rendering" strategy.
Implementation Details:
- Stable VDOM Structure:
Neo.grid.Row#createVdomnow renders the entirecellPoolSizerange of pooled cells in every pass.- Placeholders: If a pool index is not currently required by a mounted column, a placeholder cell (hidden) is rendered in that slot.
- Logical IDs: Added
ds: { cellId: ... }to all cells to support Selection Models via dataset attributes instead of DOM IDs.Result: Horizontal scrolling now generates zero
insertNode,removeNode, ormoveNodeoperations for the pooled cells. All updates are efficient attribute changes (style,cls,innerHTML), restoring the intended O(1) performance of the cell pooling feature.
tobiu closed this issue on Feb 5, 2026, 12:47 PM
We are observing a regression in
Neo.grid.Rowwhere horizontal scrolling triggers massivemoveNodeoperations for pooled cells.Symptoms:
moveNodedeltas during horizontal scrolling.Root Cause: Recent fixes for Cell Selection Models likely reintroduced dependency on visual order for DOM ID generation or structure, causing the VDOM diff engine to see "reordered" nodes instead of stable, attribute-updated nodes.
Proposed Solution:
...__cell-0,...__cell-1) and never change order in thevdom.cnarray.data-cell-idattribute for the logical identifier needed by Selection Models, instead of relying on the DOM ID.CellModelto query bydata-cell-id(or mapped logical ID) rather than DOM ID.This prioritizes scrolling performance (Zero GC/Layout Thrashing) over Selection Model lookups.