0

设置:我有 2 个表格 A 和 B 我在表格 A 中有一个 commandLink:

<h:commandLink actionListener="#{homeView.selectDiv('homeUpdates')}">#{msg.homeUpdates}
   <f:ajax render=":B" execute="@this" />
</h:commandLink>

...更新表格 B。

问题是,当我单击 ajax 链接时,它也会重建表单 A 并从我拥有的 ui:repeat 中获取异常。这是正确的行为吗?它也应该重建表格A吗?

我正在使用 JSF 2.2 并且表单 A 包含一个 ui:fragment=>ui:include=>ui:repeat

=====添加 SSCCE======= 按下更新 B 后以下代码无法运行!两次。它给出了重复 ID 的例外。ui:repeat 的值无关紧要

<h:head>
</h:head>

<h:body>
    <h:form id="A">
        <ul class="tableView notification">
            <ui:repeat var="notification" value="#{dashboardBean.notifications}">
                <li>
                    xx
                </li>
            </ui:repeat>
        </ul>

        <h:commandLink value="Update B!" listener="#{dashboardBean.toggleRendered}">
            <f:ajax execute="@this" render=":B" />
        </h:commandLink>

    </h:form>

    <h:form id="B">
    </h:form>
</h:body>
4

1 回答 1

1

在初始请求时创建视图,在回发时恢复视图。为了清楚起见,背诵JSF 2.2 规范的一些要点(强调我的):

第 2.2.1 页

如果请求不是回发……请在 ViewHandler 上调用createView() 。如果请求是回发,... 调用 ViewHandler。restoreView(),传递当前请求的 FacesContext 实例和视图标识符,并为恢复的视图返回 UIViewRoot。

第 2.5.8 页

可以对 JSF 视图中的选定组件进行处理(称为部分处理),并且可以将选定的组件呈现给客户端(称为部分呈现)。

第 13.4 页

JavaServer Faces 生命周期可以被视为由执行阶段和呈现阶段组成。部分遍历是一种可用于“访问”视图中的一个或多个组件的技术,可能使它们通过请求处理生命周期的“执行”和/或“呈现”阶段。

当您使用 AJAX 时,PartialViewContext类将包含遍历恢复的视图所需的所有信息。


所以,回到你的问题,在<f:ajax render=":B" execute="@this" />设置下,只有带有的表单id="B"会被重新渲染,这意味着<h:form id="B">没有表单嵌套等。

关于您的“不起作用”评论,带有普通视图范围托管 bean 的简单测试用例给了我预期的结果:

<h:form id="A" >
    <h:outputText value="#{twoFormsBean.a}"/>
    <h:commandLink actionListener="#{twoFormsBean.actionA}">
        Update B!
        <f:ajax execute="@this" render=":B"/>
    </h:commandLink>
</h:form>
<h:form id="B" >
    <h:outputText value="#{twoFormsBean.b}"/>
    <h:commandLink>
        Update Both!
        <f:ajax execute="@this" render=":A :B"/>
    </h:commandLink>
</h:form>

@ManagedBean
@ViewScoped
public class TwoFormsBean implements Serializable {

    private String a = "A";//getter
    private String b = "B";//getter

    public void actionA(ActionEvent ae) {
        a = "newA";
        b = "newB";
    }

}
于 2013-04-26T13:30:34.100 回答