提问者:小点点

Vaadin TextField的值在快捷方式侦听器中不可用


我想在用户按下Enter键时读取Vaadin Flow TextField的值。我可以添加一个SHOtcuListener来侦听按键,但是即使TextField不为空,侦听器中TextField的值也是空的:TextField text Field=new TextField();

   Shortcuts.addShortcutListener(UI.getCurrent(), () -> {
     String text = texttextField.getValue();
     // text doesn't contain the latest text
   }, Key.ENTER);

为什么会发生这种情况,以及如何读取用户在触发按键侦听器时输入的值?


共1个答案

匿名用户

这种行为归结为浏览器事件。虽然用户可能已经在输入元素中输入了一些文本,但在出现ValueChange事件之前,TextField的值不会更新到服务器——即使浏览器中的vaadin-ext-field元素在回车键事件发生时也不会“知道”文本(value属性尚未更新)。默认情况下,文本字段的值仅在输入失去焦点时更新。您可以通过显式切换TextField的blur来解决此问题:

// member field in class
boolean shortcutFired = false;

// ...

  Shortcuts.addShortcutListener(UI.getCurrent(), () -> {
     textField.blur();
     shortcutFired = true;
  }, Key.ENTER);

并监听值更改事件而不是快捷方式侦听器:

textField.addValueChangeListener(e -> {
  if( shortcutFired ) { 
    String value = e.getValue();
    // do something with the value
    shortcutFired = false;
  } 
}

如果您需要跟踪多个字段,这种方法不太有效;在这种情况下,您可能希望通过将其ValueChangeMode设置为ValueChangeMode. EAGER来使TextFields更急切地将其值更新到服务器。这种方法的缺点是它会增加浏览器和网络之间的流量,因为每次按键都会触发服务器请求。