2

我对 jsf 很陌生,我用 ajax 卡在了更新表中。

我需要一张与选择菜单一起工作的表格,表格需要在更改时刷新。表格的列取决于菜单值,每个值的列数可以不同。

我的代码:

<h:form>
        <h:selectOneMenu id="selectOneMenu"  value="#{reservationGuestBean.currentPremiseId}" >
            <f:selectItems value="#{reservationGuestBean.premiseNames}" var="p" itemLabel="#{p.label}" itemValue="#{p.value}" />
            <a4j:ajax event="change" listener="#{reservationGuestBean.premiseChanged}" ajaxSingle="true" render=":currentPremiseId, :reservationsHeading, :reservationsBody" />
        </h:selectOneMenu> 
    </h:form>
    <div><h:outputText id="currentPremiseId" value="PremiseId: #{reservationGuestBean.currentPremiseId}" /></div>
    <table id="reservationsTable">
        <tr>
            <ui:repeat id="reservationsHeading" var="col" value="#{reservationGuestBean.reservationTableHeading}">
                <th>#{col}</th>
            </ui:repeat>
        </tr>
        <ui:repeat id="reservationsBody" var="row" value="#{reservationGuestBean.reservationTableRows}">
            <tr>
                <ui:repeat id="reservationsRowContent" var="cell" value="#{row}">
                    <td>#{cell.value}</td>
                </ui:repeat>
            </tr>
        </ui:repeat>
    </table>

使用该代码,我可以重新加载 div 的内容,但不能重新加载表格、标题或内容。在萤火虫中,我可以看到具有所需响应的更新请求(带有 xml 的 xml),但未更新选定的表元素。

4

1 回答 1

0

快速而肮脏的答案是将您的表格包装在一个 中h:panelGroup,并在 的渲染标签上使用它的 id a4j:ajax

<h:panelGroup id="myTable">
    <table>
    ...
    </table>
</h:panelGroup>

话虽如此,您可能想学习使用该组件h:datatable,而不是自己使用ui:repeat.

它易于使用,并且将成为 JSF 视图中的一个有意义的组件,而纯 HTML 表不是(这就是为什么您不能只在 ajax 标记中重新呈现它的原因)。您可以从执行本文中的示例开始。

于 2012-07-14T00:46:23.940 回答