fix(autocomplete): fix value persistence in DOM text widgets

Remove multiple sources of truth and async sync chains that caused
values to be lost during load/switch workflow or reload page.

Changes:
- Remove internalValue state variable from main.ts
- Update getValue/setValue to read/write DOM directly via widget.inputEl
- Remove textValue reactive ref and v-model from Vue component
- Remove serializeValue, onSetValue, and watch callbacks
- Register textarea reference on mount, clean up on unmount
- Simplify AutocompleteTextWidgetInterface

Follows ComfyUI built-in addMultilineWidget pattern:
- Single source of truth (DOM element value only)
- Direct sync (no intermediate variables or async chains)

Also adds documentation:
- docs/dom-widgets/value-persistence-best-practices.md
- docs/dom-widgets/README.md
- Update docs/dom_widget_dev_guide.md with reference
This commit is contained in:
Will Miao
2026-01-26 23:22:37 +08:00
parent 7249c9fd4b
commit 9032226724
7 changed files with 260 additions and 119 deletions

View File

@@ -423,20 +423,17 @@ function createAutocompleteTextWidgetFactory(
forwardMiddleMouseToCanvas(container)
let internalValue = ''
const widget = node.addDOMWidget(
widgetName,
`AUTOCOMPLETE_TEXT_${modelType.toUpperCase()}`,
container,
{
getValue() {
return internalValue
return widget.inputEl?.value ?? ''
},
setValue(v: string) {
internalValue = v ?? ''
if (typeof widget.onSetValue === 'function') {
widget.onSetValue(v)
if (widget.inputEl) {
widget.inputEl.value = v ?? ''
}
},
serialize: true,