我有一个输入字段,用户输入一些产品名称。根据输入的名称,应显示该产品的特定详细信息。在输入更改时,我使用当前字段值从数据源获取产品,并使用AJAX
重新呈现产品详细信息。到目前为止,用户在输入正确的名称之前无法查看产品详细信息。
以下是代码示例:
<h:form>
<h:inputText id="product" value="#{myBean.product}" required="true" converter="productConverter">
<a4j:ajax event="change" render="product, details"/>
</h:inputText>
<rich:message for="product" ajaxRendered="true"/>
<h:panelGroup id="details">
<h:outputText rendered="#{not empty myBean.product}" value="#{myBean.product.details}"/>
</h:panelGroup>
<a4j:commandButton execute="@form" render="@form" value="Validate" action="validate"/>
</h:form>
转换器:
public class ProductConverter implements Converter {
public Object getAsObject(FacesContext context, UIComponent component, String name) {
return (name != null && ProductDataSource.projectExist(name)) ? new Product(name) : null;
}
public String getAsString(FacesContext context, UIComponent component, Object value) {
return (value instanceof Product) ? ((Product) value).getName() : "";
}
产品是必填字段,因此无法提交表单,直到输入正确的名称。到目前为止,当用户输入错误名称时,转换器返回null并且验证失败。但我想要的是仅在表单提交时验证此字段,并在重新呈现输入字段时跳过验证。我尝试在immediate="true"
和a4j:ajax
上应用h:inputText
,但没有任何帮助。有任何想法吗?
提前致谢!
(我使用的是JSF 2,Richfaces 4)
答案 0 :(得分:3)
只有在按下提交按钮时,才允许required
属性评估true
。您可以通过在请求参数映射中检查其客户端ID的存在来执行此操作,如下所示:
<h:inputText ... required="#{not empty param[button.clientId]}" />
...
<a4j:commandButton binding="#{button}" ... />
(不,你不需要将它绑定到bean属性,代码按原样完成)
答案 1 :(得分:0)
为了跳过Jsf验证,您已添加到表单中 在a4j中写立即=“true”:commandButton
答案 2 :(得分:0)
尝试使用类似
的内容<a4j:outputPanel ajaxRendered="true">
<h:inputText id="product" value="#{myBean.product}" required="true" converter="productConverter">
<a4j:support event="onchange" reRender="details" ajaxSingle="true"/>
</h:inputText>
<rich:message id="product" for="details" ajaxRendered="true">
<h:panelGroup id="details">
<h:outputText rendered="#{not empty myBean.product}" value="#{myBean.product.details}"/>
</h:panelGroup>
</a4j:outputPanel>
主要想法是使用 ajaxSingle =&#34; true&#34; 来避免完整的输出面板验证。