具有自定义可编辑输入字段的 PrimeFaces selectOneMenu

PrimeFaces selectOneMenu with custom editable inputField

愚蠢的问题,但这就是我的情况。我有可编辑的 PrimeFaces selectOneMenu,其中 inputField 有以下限制:

除了最后一个有十进制数限制外,一切都很好。这意味着我不能在那里输入 1.111,只能输入 1.11selectOneMenu 的更改事件 keyUp 遗憾地添加到标签 select 而不是输入。

有什么解决办法吗?

这需要自定义验证器。创建一个检查预定义值的方法,如果未找到匹配项,则检查数字格式。基本示例:

@FacesValidator("myValidator")
public class MyValidator implements Validator
{

  private List<String> predefinedValues = Arrays.asList("my", "list");

  @Override
  public void validate(FacesContext context, UIComponent component, Object value)
  throws ValidatorException
  {
    String valueStr = (String) value;
    // Check if value is predefined
    if (predefinedValues.contains(valueStr)) {
      return;
    }
    // If not predefined, check number format
    if (! valueStr.matches("^\d+(\.\d\d?)?$")) {
      throw new ValidatorException(new FacesMessage("Value is invalid!"));
    }
    // Check number limits...
  }

}

验证器可以在您的 XHTML 中用作:

<p:selectOneMenu editable="true" ...>
  ...
  <f:validator validatorId="myValidator" />
</p:selectOneMenu>

作为替代方案,您可以使用 jQuery 查找输入字段并将 keypress 侦听器绑定到它。参见示例:Jquery: filter input on keypress。但是,我会保留验证器。例如,用户可以粘贴文本。

另请参阅:

  • How to perform validation in JSF, how to create a custom validator in JSF
  • Regular expression for floating point numbers