Commit 78dcb63
fix(gxt): route classic {{#each}} through $_eachSync for DOM-node identity
Async $_each updates the DOM on a microtask, which lands AFTER the
synchronous __gxtSyncDomNow → __gxtForceEmberRerender morph fallback
runs. The morph then diffs the new full-template fragment against the
pre-mutation live DOM and clobbers Text node content position-by-position,
destroying the keyed-row identity guarded by assertPartialInvariants
in the each-test "it maintains DOM stability for stable keys when list
is updated" cases. SyncListComponent is identity-preserving and runs
inline with __gxtSyncDomNow, so morph then sees identical DOM and is a
no-op for the keyed rows.
Smoke 333/333; previously failing 3 each-stability tests now pass with
no regressions in toggling-each (39/39), curly components (120/120), or
{{get}} (21/21). Vitest 3785/3785.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>1 parent f72b48a commit 78dcb63
1 file changed
Lines changed: 26 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
12171 | 12171 | | |
12172 | 12172 | | |
12173 | 12173 | | |
12174 | | - | |
12175 | | - | |
| 12174 | + | |
| 12175 | + | |
| 12176 | + | |
| 12177 | + | |
| 12178 | + | |
| 12179 | + | |
| 12180 | + | |
| 12181 | + | |
| 12182 | + | |
| 12183 | + | |
| 12184 | + | |
| 12185 | + | |
| 12186 | + | |
| 12187 | + | |
| 12188 | + | |
| 12189 | + | |
| 12190 | + | |
| 12191 | + | |
| 12192 | + | |
| 12193 | + | |
| 12194 | + | |
| 12195 | + | |
| 12196 | + | |
| 12197 | + | |
| 12198 | + | |
| 12199 | + | |
12176 | 12200 | | |
12177 | 12201 | | |
12178 | 12202 | | |
| |||
0 commit comments