2017-04-05 50 views
1

愚蠢的問題,但這是我的情況。我有編輯PrimeFaces selectOneMenu其中inputField有以下限制:PrimeFaces selectOneMenu自定義可編輯輸入域

  • 下,並允許
  • 時被輸入十進制數允許數量的上限
  • 預定義的文本輸入只有2個十進制數字

除了最後一個有十進制數字限制外,所有的都很好。這意味着我無法輸入1.111,而只能輸入1.11。更改事件keyUpselectOneMenu可悲地添加到標籤選擇但不輸入。

任何想法如何解決?

回答

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。但是,我會保留驗證器。例如,用戶可以粘貼文本。

參見:

+0

謝謝你,但它不是我想要的。我已經有驗證器。我想實現的是,甚至不可能輸入。類似輸入掩碼。 – Smolda

+0

我補充說,作爲答案的替代方案。 –

+0

啊...這是有道理的。 :) – Smolda