Description
While fixing #597 (Slider value not updating) in #1022, I discovered that other v0.8 interactive components have the same latent bug: they call processor.setData() without requestUpdate(), meaning the component does not re-render after the data model is updated.
Affected components
| Component |
File |
Has requestUpdate()? |
Slider |
renderers/lit/src/0.8/ui/slider.ts |
Yes (fixed in #1022) |
MultipleChoice |
renderers/lit/src/0.8/ui/multiple-choice.ts |
Yes (already had it) |
TextField |
renderers/lit/src/0.8/ui/text-field.ts |
No |
DateTimeInput |
renderers/lit/src/0.8/ui/datetime-input.ts |
No |
CheckBox |
renderers/lit/src/0.8/ui/checkbox.ts |
No |
Why it's not immediately visible
- TextField: The native `` element displays typed characters regardless of Lit re-renders, so the bug is masked. However, any other component or label bound to the same data path will not update.
- CheckBox / DateTimeInput: These would need testing to confirm visible impact.
Suggested fix
In #1022 I added a updateBoundData() helper to the Root base class that encapsulates the setData() + requestUpdate() pattern. The affected components can be refactored to use it, the change would be minimal for each.
Root cause
The deeper issue is that SignalWatcher does not pick up changes made through SignalMap.set() during processor.setData(). This might be worth investigating separately in web_core, but in the meantime requestUpdate() is a reliable workaround (and already used by MultipleChoice).
Description
While fixing #597 (Slider value not updating) in #1022, I discovered that other v0.8 interactive components have the same latent bug: they call
processor.setData()withoutrequestUpdate(), meaning the component does not re-render after the data model is updated.Affected components
requestUpdate()?Sliderrenderers/lit/src/0.8/ui/slider.tsMultipleChoicerenderers/lit/src/0.8/ui/multiple-choice.tsTextFieldrenderers/lit/src/0.8/ui/text-field.tsDateTimeInputrenderers/lit/src/0.8/ui/datetime-input.tsCheckBoxrenderers/lit/src/0.8/ui/checkbox.tsWhy it's not immediately visible
Suggested fix
In #1022 I added a
updateBoundData()helper to theRootbase class that encapsulates thesetData()+requestUpdate()pattern. The affected components can be refactored to use it, the change would be minimal for each.Root cause
The deeper issue is that
SignalWatcherdoes not pick up changes made throughSignalMap.set()duringprocessor.setData(). This might be worth investigating separately inweb_core, but in the meantimerequestUpdate()is a reliable workaround (and already used byMultipleChoice).