【问题标题】:Close all expanded rows inside a ui:repeat关闭 ui:repeat 中所有展开的行
【发布时间】:2012-02-27 14:48:00
【问题描述】:

我在一张桌子上有一个 ui:repeat 拍卖物品。它是一个常规的 html 表格,因为当您单击 Bid commandLink 时,会在所选拍卖项目的正下方打开一行,并显示一个投标组件。 Bid commandLink 正在使用这样的 ajax:

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

addBidView 正在更新auctionItems 的地图,这就是打开正确选定行的方式。当用户再次点击相同的 Bid 链接时,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"

以及我能想到的所有其他线索。没有任何效果。有任何想法吗?

【问题讨论】:

    标签: jsf-2


    【解决方案1】:

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

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

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

    准确获取此客户端 ID 并在其前面加上 : 以在 &lt;f:ajax render&gt; 中使用。

    <f:ajax ... render=":someId:possiblyOtherId:entireLoop" />
    

    如果它包含动态生成的 ID,例如 j_id_123,那么您需要为所有父 NamingContainer 组件(例如 &lt;h:form&gt;)提供固定 ID,例如 &lt;h:form id="someId"&gt;

    请注意,不可能引用像&lt;table id="bidsTable"&gt; 这样的纯 HTML 元素的客户端 ID。它必须是一个完整的 JSF 组件,例如 &lt;h:dataTable id="bidsTable"&gt;

    【讨论】:

    • 好的,太好了。问题是 不是游戏的一部分。我创建了一个包装表格的 panelGroup 并给它“bidstable” id,现在 form:bidstable 可以工作了。再次感谢 BalusC。
    猜你喜欢
    • 2015-11-20
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    相关资源
    最近更新 更多