关闭ui内的所有展开行:重复

时间:2012-02-27 14:48:01

标签: jsf-2

我有一个ui:在桌子内重复拍卖物品。它是一个常规的html表,因为当您单击Bid commandLink时,在所选拍卖项目下方会打开一行,并显示一个出价组件。 Bid commandLink使用如下的ajax:

<f:ajax listener="#{bean.addBidView(lot)}" render="bidView" />

addBidView正在更新auctionItems的地图,这就是正确选择的行的打开方式。当用户再次点击同一个出价链接时,addBidView会将其计算出来并关闭出价组件。

现在让我们假设用户点击了几行,从而打开了几个出价组件。它们都打开了,但只有一个是活跃的。所以这是我的问题:当我使用上面的ajax时,如何让整个循环渲染,以便打开一个竞标组件会自动关闭其他打开的组件。 (拍卖物品地图反映了正确的出价组件,但只有这一个出价区域被渲染,所以其他的不受影响。如果我刷新整个页面,显示是正确的,问题只存在于我我正在使用ajax。)

这是页面上元素的结构(所有这些都在h:form :)

<table id="bidstable">
    <h:panelGroup id="entireLoop">
        <ui:repeat id="repeatAuctionItems" var="auctionItem" varStatus="status" value="#{bean.auctionItems}">
            <td>... a bunch of td's with the auction item values ... and then: 
                <h:commandLink id="bid" rendered="#{some conditions}">
                    <f:ajax listener="#{bean.addBidView(auctionItem)}" render="bidView"/>
                </h:commandLink>
            </td>
        </ui:repeat>
    </h:panelGroup>
</table>

我在“渲染”中尝试了几乎所有元素的组合 - 例如:

render="bidView bidsTable"

或         render =“bidView bidsTable:entireLoop:repeateAuctionItems”

以及我能想到的其他所有道路。什么都行不通。有任何想法吗?

1 个答案:

答案 0 :(得分:2)

您已在<f:ajax render>属性中指定了 relative 到当前NamingContainer组件的客户端ID。不以命名容器分隔符开头的客户机ID(默认为:)与当前NamingContainer组件相关。 <ui:repeat>就是这样一个组成部分。因此,客户端ID必须引用<ui:repeat>的孩子。但是您尝试引用的组件实际上在<ui:repeat>之外。您需要使用绝对客户端ID来引用它。

要查找绝对客户端ID,您需要在浏览器中打开该页面,右键单击并执行查看源,然后找到最近的父JSF生成的HTML <ui:repeat>之外的组件,在您的特定情况下为<h:panelGroup id="entireLoop">。它看起来像是:

<span id="someId:possiblyOtherId:entireLoop">

获取此客户ID,并在:前加上<f:ajax render>,以便在<f:ajax ... render=":someId:possiblyOtherId:entireLoop" /> 中使用。

j_id_123

如果它包含动态生成的ID,例如NamingContainer,那么您需要为<h:form>所有父<h:form id="someId">组件提供固定ID,例如<table id="bidsTable">

请注意,引用纯HTML 元素(例如<h:dataTable id="bidsTable">)的客户端ID 是不可能的。它必须是一个完整的JSF组件,如{{1}}。