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。

因此我可以提交整个表单而无需验证、设置类型、根据更改的类型重新呈现新字段,并在其他字段中保留提交的值。