🐛 Bug Report
After client-side hydration, structural template directives (<f-when>,
<f-repeat>) and property bindings (:prop) do not re-evaluate when their
underlying @observable properties change. Simple {{interpolation}} and
attribute bindings DO work reactively, creating an inconsistency that forces
app developers into imperative DOM workarounds.
💻 Repro or Code Sample
| Field |
Detail |
| Expected |
<f-repeat value="item in items"> re-renders when items are added or removed. |
| Actual |
The loop renders only the initial SSR items. push(), pop(), splice() have no effect on the DOM. Even replacing the array reference (this.items = [...this.items]) may not trigger re-render. |
| Root cause |
Same as <f-when> — <f-repeat> is a compile-time structural directive not subscribed to observables after hydration. Additionally, FAST's array observation requires reference replacement, not mutation, but even that doesn't help for <f-repeat>. |
| Affected apps |
downloads_btr (download list), history_btr, settings_btr (list-based settings pages), all BTR apps rendering dynamic lists. |
| Severity |
P1 — Broken functionality. Any BTR page with a list that changes after initial render is affected. |
| Workaround |
Array reference replacement + Observable.notify() (partial), or fresh element creation for entire sections. See Workaround B and Workaround C. |
| Suggested fix |
Framework-level: <f-repeat> blocks should subscribe to their source observable during hydration, mirroring repeat() behavior in standard FAST Element. |