Primefaces KeyFilter:调用" ajax update"在h:inputText

时间:2018-04-18 09:17:27

标签: primefaces keyfilter

Prime faces p:在h:inputText上发生ajax更新时,keyFilter停止工作。请看下面的例子。

预期行为: p:keyFilter在任何时候都应该只允许inputText中的字母和数字。

重现的步骤:

1)直接进入"项目密钥"字段并尝试输入特殊字符..它将不允许..此时过滤器有效。

2)现在转到"项目名称"字段,然后单击"项目键"。这次尝试输入特殊字符。它允许进入。过滤器现在不起作用。

示例xhtml:

    <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:f="http://java.sun.com/jsf/core">
    <h:head>

    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 

</h:head>   
    <h:form>
        <h:outputText value="Project Name:"></h:outputText>
        <h:inputText id="projectName" value="#{testBean.projectName}" >
            <p:ajax event="blur" listener="#{testBean.updateKey()}" update="projectKey" process="@form"></p:ajax>
        </h:inputText>
        <br/>
        <h:outputText value="Project Key:"></h:outputText>
        <h:inputText id="projectKey" value="#{testBean.projectKey}"  label="Project Key" size="29" maxlength="10">
        </h:inputText>
        <p:keyFilter for="projectKey" mask="alphanum" />
    </h:form>
</html>

示例托管Bean:

import javax.faces.bean.ManagedBean;
import javax.persistence.Entity;

@ManagedBean(name="testBean")
@Entity
public class Test {

    private String projectName;
    private String projectKey;

    public String getProjectName() {
        return projectName;
    }

    public void setProjectName(String projectName) {
        this.projectName = projectName;
    }

    public String getProjectKey() {
        return projectKey;
    }

    public void setProjectKey(String projectKey) {
        this.projectKey = projectKey;
    }

    public void updateKey()
    {
        if(projectName.equals("Shivani"))
        {
            projectKey = "SK";
        }
    }
}

2 个答案:

答案 0 :(得分:1)

此错误已报告给PrimeFaces:https://github.com/primefaces/primefaces/issues/3596

该错误位于Jquery KeyFilter插件本身中:https://github.com/akzhan/jquery-keyfilter/issues/7

补丁已应用,将在PrimeFaces 6.3及更高版本中使用。

答案 1 :(得分:0)

当keyFilter被“渲染”时,将应用PrimeFaces键过滤器。它的应用方式可以在source of the keyfilter.js中看到。

在PrimeFaces展示(和文档)中,您将看到两个示例:

<p:inputText id="text1" value="....">
    <p:keyFilter regEx="/[ABC]/i"/>
</p:inputText> 

<h:outputText value="KeyFilter with mask on a h:inputText"/>   
<h:inputText id="text2" value="..."/>   
<p:keyFilter for="text2" mask="num" /> 

p:keyFilter嵌套的地方和使用for属性的地方之一。在更新输入后,后者不会自动重新应用,但前者将会重新应用。

如果确实需要非嵌套方式,请确保通过显式更新输入和密钥过滤器来更新输入和密钥过滤器,或者将它们嵌套在例如两者中。 h:panelgroup id="inputAndFilter"并更新。

<h:panelgroup id="inputAndFilter">
    <h:inputText id="text2" value="..."/>   
    <p:keyFilter for="text2" mask="num" />
</ui:panelgroup>