0

我知道在 Vaadin7 (8) 中有一些方法可以从服务器端获取/设置文本字段的光标位置。

我正在使用 Vaadin Flow v21,但没有这样的方法。如何从服务器端同步获取/设置光标位置?使用一些javascript设置它看起来可以正常工作,但我无法读取实际的光标位置,因为它只是异步的。如何做到同步?

我试着这样读:

public int getSelectionStart() throws InterruptedException
{
    Future<Integer> value = UI.getCurrent().getPage().executeJs(
            "return $0.shadowRoot.querySelector('[part=\"value\"]').selectionStart;"
            , getElement()).toCompletableFuture(Integer.class);

    final int[] val = new int[1];

    Thread t = new Thread(() ->
    {
        Integer result = null;
        try
        {
            result = value.get();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        val[0] = result == null ? 0 : result;
    });

    t.start();
    t.join();

    return val[0];
};

但是上面的方法给了我一个例外,正在进行的 UI 会话请求还没有关闭,所以基本上它不能执行 javascript,除非我结束请求。

这就是我设置光标位置的方式,这似乎有效,因为我不想返回任何返回值,因此结束请求将执行脚本并设置正确的光标位置。

public void setSelectionStart(int pos)
{
    UI.getCurrent().getPage().executeJs("$0.shadowRoot.querySelector('[part=\"value\"]').setSelectionRange($1, $1);", getElement(), pos);
}

感谢您的任何帮助/建议!

4

1 回答 1

1

我希望 RPC 返回值的文档可以在这里提供帮助:https ://vaadin.com/docs/latest/flow/element-api/client-server-rpc/#return-values

于 2021-12-07T11:17:28.510 回答