我将此代码从 JSF 1.2 应用程序转换为 JSF 2.x 应用程序
中的等效代码时遇到问题<h:selectOneMenu id="type" value="#{bean.type}">
<f:selectItems value="#{bean.typeList}"/>
<a4j:support event="onchange"
ajaxSingle="false"
immediate="true"
reRender="myForm">
<a4j:actionparam name="type"
value="this.value"
assignTo="#{bean.type}"
noEscape="true"/>
</a4j:support>
</h:selectOneMenu>
此代码段的工作原理。
根据#{bean.type}
中的选定值,我的页面会显示不同的字段。
当用户更改"type"
字段时,整个表单将被重新呈现,但不进行表单验证(ajaxSingle="false", immediate="true", reRender="myForm"
)。
我不想在这里验证filds,我只想为#{bean.type}
设置新值并重新呈现页面以显示不同的字段(取决于#{bean.type}
)。
这就是为什么我需要在#{bean.type}
内设置a4j:actionparam
。
关于此代码的一个很好的功能是重新渲染后保留其他文件中的提交值。
我试图在 JSF 2.x 中做同样的事情但没有成功:
<h:selectOneMenu iid="type" value="#{bean.type}">
<f:selectItems value="#{bean.typeList}"/>
<a4j:ajax event="valueChange" render="@form" execute="@this"/>
</h:selectOneMenu>
此:
<a4j:ajax event="valueChange" render="@form" execute="@this"/>
将重新呈现整个表单,我将丢失其他字段的提交值
此:
<a4j:ajax event="valueChange" render="@form" execute="@form"/>
将提交,验证和重新呈现整个表单(我只想在 JSF 1.2 中提交而不进行验证)
此:
<a4j:ajax event="valueChange" render="@form" execute="@form" immediate="true"/>
也不起作用(与上面相同)
所以我的问题是如何在 JSF 2.x 中实现相同的行为?
由于
答案 0 :(得分:0)
感谢安德烈的评论,我找到了解决方案:
<h:selectOneMenu id="type"
value="#{bean.type}"
valueChangeListener="#{bean.typeChangeListener}"
immediate="true">
<f:selectItems value="#{bean.typeList}"/>
<a4j:ajax execute="@form" render="@form" listener="#{facesContext.renderResponse}" immediate="true"/>
</h:selectOneMenu>
和
public void typeChangeListener(ValueChangeEvent event) {
type = (String) event.getNewValue();
}
立即在a4j:ajax导致该监听器=&#34;#{facesContext.renderResponse}&#34;在应用请求值阶段调用,renderResponse跳过验证。
立即执行h:selectOneMenu导致在应用请求值阶段也调用valueChangeListener。
因此,我可以提交整个表单而不进行验证,设置类型,根据更改的类型重新呈现新字段,并保留其他文件中的提交值。