我有一个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”
以及我能想到的其他所有道路。什么都行不通。有任何想法吗?
答案 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}}。