Vaadin 23:JavaScript 更改的 addPropertyChangeListener

Vaadin 23: addPropertyChangeListener for JavaScript changes

预期:在 Vaadin 23 应用程序中,我希望在 HTML 属性的值更改时得到通知。

我尝试了什么:我创建了这个输入公式:

    // Text input field
    Input input = new Input();
    input.setId("myInputField");
    Element textInput = input.getElement();
    
    // Change listener for property "value"
    // Works well for manual input
    // BUT doesn't work for JavaScript changes
    textInput.addPropertyChangeListener("value", "change", 
        e -> {System.out.println(e.getValue());}
    );
    
    // Button that changes the value of attribute "value"
    Button button = new Button("Change value");
    button.addClickListener(e -> {UI.getCurrent().getPage().executeJs(
        "document.getElementById('myInputField').setAttribute('value','hello');"
    );});

    this.add(input, button);

什么起作用:当用户在输入字段中键入“something”时,服务器将“something”打印到控制台。这是有意和观察到的。好的。

什么不起作用:当用户按下按钮时,输入字段的内容是“你好”(确定)。但是 PropertyChangeListener 不会触发事件,因此服务器不会向控制台打印任何内容。

问题:有没有办法让 PropertyChangeListener 触发事件,即使属性的值已被 JavaScript 更改?

我看到这里有两个问题。

首先,Vaadin Flow 中的 server-side 属性 更改侦听器需要由 client-side 事件触发。 <input> 元素在用户直接更改字段中的值时触发事件,但在以编程方式更改值时则不会。如果您从代码更改值,那么您还需要手动触发一个事件来触发更新。

其次,正如评论中所指出的,您应该更改 属性 而不是属性。在大多数情况下,属性和同名的 属性 保持同步,但输入的值是一个例外。这里,属性是初始值,属性 是实际值。如果您只更改属性,则保持不变,但在用户通过 UI 进行编辑或更改 属性 后会有所不同。