具有自定义可编辑输入字段的 PrimeFaces selectOneMenu
PrimeFaces selectOneMenu with custom editable inputField
愚蠢的问题,但这就是我的情况。我有可编辑的 PrimeFaces selectOneMenu
,其中 inputField
有以下限制:
- 输入的数字的下限和上限
- 允许预定义文本
- 当输入十进制数时,只允许输入 2 个十进制数
除了最后一个有十进制数限制外,一切都很好。这意味着我不能在那里输入 1.111
,只能输入 1.11
。 selectOneMenu
的更改事件 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
愚蠢的问题,但这就是我的情况。我有可编辑的 PrimeFaces selectOneMenu
,其中 inputField
有以下限制:
- 输入的数字的下限和上限
- 允许预定义文本
- 当输入十进制数时,只允许输入 2 个十进制数
除了最后一个有十进制数限制外,一切都很好。这意味着我不能在那里输入 1.111
,只能输入 1.11
。 selectOneMenu
的更改事件 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