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 
<p:commandLink action="#{Test.assignElement}" update="detail_value">
<f:setPropertyActionListener target="#{Test.currentElement}" value="1" />
Assign
</p:commandLink>
</li>
<li>Element 2 
<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的答案是有效的,但我找到的最佳解决方案是:
使用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)如果您使用的是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)这是"输入元素"(EditableValueHolder实际上)的臭名昭着的情况,一旦验证失败,它们就永远无法通过AJAX重新渲染再次更新.
看到:
解决方法是创建一个动作侦听器,重置要重新渲染的组件.请参见最后一页:http://community.jboss.org/message/620000
如果这种行为困扰你(我猜它确实如此),那么请不要犹豫,投票支持JAVASERVERFACES_SPEC_PUBLIC-1060,如果可能的话,留下评论告诉你的期望和原因.
| 归档时间: |
|
| 查看次数: |
21456 次 |
| 最近记录: |