Primefaces KeyFilter:调用“后不工作”;ajax更新";关于h:inputText

Primefaces KeyFilter:调用“后不工作”;ajax更新";关于h:inputText,primefaces,keyfilter,Primefaces,Keyfilter,当h:inputText上发生ajax更新时,Prime faces p:keyFilter停止工作。请看下面的例子 预期行为: p:keyFilter在任何时候都应该只允许inputText中的字母和数字 复制步骤: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://

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

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

复制步骤:

    <!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>
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";
        }
    }
}
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>
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";
        }
    }
}

“渲染”关键过滤器时,将应用PrimeFaces关键过滤器。它的应用方式可以从中看出

在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" /> 

已向PrimeFaces报告此错误:

该bug存在于Jquery KeyFilter插件本身:


该修补程序已应用,将在PrimeFaces 6.3及更高版本中。

offtopic:不要使实体也成为托管bean。让它成为豆子的财产:。非常感谢。我试图通过为过滤器提供单独的Id来明确更新过滤器和输入。但这并不奏效。将它们嵌套在ui片段中是可行的,但在这种情况下,不会更新projectKey。根据上述代码逻辑,如果我在项目名称中输入“Shivani”,那么项目密钥应该由“SK”自动填充。但在将其嵌套到ui中后,现在不会发生这种情况:fragmentHmmmm。。。我希望你能看到输入文本中仍然需要值部分。。。如果您确实有这样的问题,那么将控件嵌套在h:panelGroup而不是ui:fragment workshmmm中会出现另一个问题。。。奇怪的最喜欢,因为它不呈现任何东西,它不能被PF ajax更新。。。今晚让我检查一下……您可以尝试使用
f:ajax render=“…”
ui:fragment