PrimeFaces selectOneMenu具有自定义可编辑inputField

时间:2017-04-05 14:59:32

标签: jsf primefaces selectonemenu

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

  • 中输入的数字的下限和上限
  • 允许预定义文字
  • 当输入十进制数时只允许2个十进制数

一切都很好,除了最后一个有十进制数限制。这意味着我无法键入1.111,只能1.11keyUp的更改事件selectOneMenu遗憾地添加到标记选择中,但不会输入。

任何想法如何解决?

1 个答案:

答案 0 :(得分:2)

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

@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。但是,我会保留验证器。例如,用户可以粘贴文本。

另见: