Skip to content

<f-repeat> Does Not Re-render After Hydration #7322

@mcritzjam

Description

@mcritzjam

🐛 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions