Jsf RichFaces a4j:support 迁移到 a4j:ajax
Jsf RichFaces a4j:support migration to a4j:ajax
我在将此代码从 JSF 1.2 应用程序转换为 JSF 2.x 应用程序[=24= 中的等效代码时遇到问题]
<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"
)。
我不想在此处验证字段,我只想为 #{bean.type}
设置新值并重新呈现页面以显示不同的字段(取决于 #{bean.type}
)。
这就是为什么我需要在 a4j:actionparam
.
中手动设置 #{bean.type}
此代码的一个不错的功能是在重新呈现后保留其他文件中提交的值。
我试图在 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 中实现相同的行为?
谢谢
感谢 Andrey 的评论,我找到了解决方案:
<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 导致在应用请求值阶段调用 listener="#{facesContext.renderResponse}" 并且 renderResponse 跳过验证。
立即 h:selectOneMenu 导致在应用请求值阶段也会调用 valueChangeListener。
因此我可以提交整个表单而无需验证、设置类型、根据更改的类型重新呈现新字段,并在其他字段中保留提交的值。
我在将此代码从 JSF 1.2 应用程序转换为 JSF 2.x 应用程序[=24= 中的等效代码时遇到问题]
<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"
)。
我不想在此处验证字段,我只想为 #{bean.type}
设置新值并重新呈现页面以显示不同的字段(取决于 #{bean.type}
)。
这就是为什么我需要在 a4j:actionparam
.
#{bean.type}
此代码的一个不错的功能是在重新呈现后保留其他文件中提交的值。
我试图在 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 中实现相同的行为?
谢谢
感谢 Andrey 的评论,我找到了解决方案:
<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 导致在应用请求值阶段调用 listener="#{facesContext.renderResponse}" 并且 renderResponse 跳过验证。
立即 h:selectOneMenu 导致在应用请求值阶段也会调用 valueChangeListener。
因此我可以提交整个表单而无需验证、设置类型、根据更改的类型重新呈现新字段,并在其他字段中保留提交的值。