验证失败后的Primefaces JSF更新不起作用

Tin*_*ard 15 validation jsf primefaces ajax-update

我对a的验证<p:inputText>和更新其内容有疑问.

基本上,当inputText验证失败时,它永远不会再次更新.

这是一个简单的例子来澄清:

Facelet:

!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
    <h:head>
    </h:head>
    <body>
    <h1>Test</h1>

        <h:form id="list" prependId="false">
            <ul>
                <li>Element 1&#160;
                    <p:commandLink action="#{Test.assignElement}" update="detail_value">
                        <f:setPropertyActionListener target="#{Test.currentElement}" value="1" />
                        Assign
                    </p:commandLink>
                </li>
                <li>Element 2&#160;
                    <p:commandLink action="#{Test.assignElement}" update="detail_value">
                        <f:setPropertyActionListener target="#{Test.currentElement}" value="2" />
                        Assign
                    </p:commandLink>
                </li>
            </ul>
        </h:form>

        <h:form id="detail" prependId="false">
            <p:inputText value="#{Test.element}" id="detail_value" required="true" styleClass="#{Faces.messagesFor['detail_value'] ? 'border:1px solid red' : ''}">
                <p:ajax event="blur" update="detail_value"></p:ajax>
            </p:inputText>
        </h:form>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

测试bean:

package com.easydevel.test;

public class Test {

    private String currentElement;
    private String element;

    public String getCurrentElement() {
        return currentElement;
    }

    public void setCurrentElement(String currentElement) {
        this.currentElement = currentElement;
    }

    public String getElement() {
        return element;
    }

    public void setElement(String element) {
        this.element = element;
    }

    public String assignElement(){
        setElement(getCurrentElement());
        return "";
    }

}
Run Code Online (Sandbox Code Playgroud)

如果单击"元素"下方的commandLinks,输入字段将更新,但是当验证失败时(只需将输入文本留空,然后单击页面的任何其他部分),输入的边框将变为红色.之后,单击上面提到的commandLinks时,它永远不会再次更新.

有任何想法吗?

Sam*_*mar 10

Arjan tijms的答案是有效的,但我找到的最佳解决方案是:

  1. 使用Omnifaces解决方案 因此,不是实现监听器,而是您需要的只是一行简单代码.

    <h:commandButton value="Update" action="#{bean.updateOtherInputs}">
    <f:ajax execute="currentInputs" render="otherInputs" />
    <f:actionListener type="org.omnifaces.eventlistener.ResetInputAjaxActionListener" />
    </h:commandButton>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您使用的是Primefaces,可以使用resetInput组件:

    <p:commandButton value="Reset Non-Ajax" actionListener="#{resetInputView.reset}"
    immediate="true" ajax="false" style="margin-right:20px;">
    <p:resetInput target="panel" />
    </p:commandButton>  
    
    Run Code Online (Sandbox Code Playgroud)


Arj*_*jms 5

这是"输入元素"(EditableValueHolder实际上)的臭名昭着的情况,一旦验证失败,它们就永远无法通过AJAX重新渲染再次更新.

看到:

  1. JSF AJAX验证:执行="@ this"render ="@ form"不一致,具体取决于先前的请求
  2. 在验证错误发生后,如何使用PrimeFaces AJAX填充文本字段?
  3. http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-1060

解决方法是创建一个动作侦听器,重置要重新渲染的组件.请参见最后一页:http://community.jboss.org/message/620000

如果这种行为困扰你(我猜它确实如此),那么请不要犹豫,投票支持JAVASERVERFACES_SPEC_PUBLIC-1060,如果可能的话,留下评论告诉你的期望和原因.