Frontmatter
| id | 8993 |
| title | Fix Grid Empty View Regression on Column Change |
| state | Closed |
| labels | bugregression |
| assignees | tobiu |
| createdAt | Feb 4, 2026, 11:24 PM |
| updatedAt | Feb 4, 2026, 11:26 PM |
| githubUrl | https://github.com/neomjs/neo/issues/8993 |
| author | tobiu |
| commentsCount | 1 |
| parentIssue | null |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Feb 4, 2026, 11:26 PM |
Fix Grid Empty View Regression on Column Change
tobiu assigned to @tobiu on Feb 4, 2026, 11:25 PM

tobiu
Feb 4, 2026, 11:26 PM
Input from Gemini 3 Pro:
✦ I have implemented the Self-Healing VDOM Strategy directly on the
devbranch.Implementation Details: In
GridBody.createViewData:
- Reset:
vdomRoot.cnis explicitly cleared to[]before the row iteration loop.- Rebuild: Inside the loop, after updating each row's content,
vdomRoot.cn.push(item.createVdomReference())is called.This logic ensures that the VDOM tree sent to the worker is always strictly synchronized with the active Row components (
me.items), recovering gracefully from any race conditions or logic (likeonStoreLoad) that might have cleared the VDOM tree while preserving component instances.Fixed Commit:
b7f2d9e47Status: Fix applied and pushed todev.
tobiu closed this issue on Feb 4, 2026, 11:26 PM
Problem
When dynamically changing the number of columns in
Neo.grid.Container(e.g., in the Big Data example), the Grid Body sometimes renders as empty (<div id="grid-body"></div>with no children), even thoughRowcomponents exist in memory and are actively updating.Analysis
This is caused by a race condition or logic in
onStoreLoadthat clearsvdom.cn(children references) but fails to repopulate them ifme.items(Component instances) persists. Specifically,createViewDataiteratesme.itemsand callsupdateContenton them (triggering internal Row VDOM updates), but it assumesGridBody.vdom.cnstill contains the references to these items. Ifvdom.cnwas cleared (e.g., by a zero-item store load event or sync drift),GridBody.update()sends an empty child list to the VDOM worker, effectively detaching the rows from the DOM.Solution
Implement a Self-Healing VDOM Strategy in
GridBody.createViewData. Instead of relying on statefulvdom.cnpersistence,createViewDatashould explicitly rebuildvdom.cnfrom the activeme.itemsduring every render pass.Logic:
vdomRoot.cn = []before iterating rows.item.createVdomReference()tovdomRoot.cn.This ensures the VDOM tree sent to the worker is always synchronized with the active Row components.
Impact
Restores robustness to Grid rendering, fixing the "Empty View" regression during column re-configuration and preventing similar desync issues.