我有一个用户界面:重复拍卖项目内的表。它是一个常规的html表格,因为当你点击一个竞价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“中的每种元素组合--例如:
render="bidView bidsTable"或render="bidView bidsTable:entireLoop:repeateAuctionItems“
还有我能想到的所有其他线索。毫无办法。有什么想法吗?
发布于 2012-02-27 23:00:49
您已经在相对于当前NamingContainer组件的<f:ajax render>属性中指定了客户端ID。不以命名容器分隔符(默认为: )开头的客户机ID相对于当前NamingContainer组件。<ui:repeat>就是这样一个组件。因此,客户端ID必须引用<ui:repeat>的子级。但是您尝试引用的组件实际上在<ui:repeat>之外。您需要用一个绝对的客户端ID来引用它。
要找到绝对客户机ID,您需要在浏览器中打开页面,右键单击并执行View Source,然后定位到<ui:repeat>外部最近的父JSF组件生成的HTML,在您的特定情况下就是<h:panelGroup id="entireLoop">。它看起来像这样:
<span id="someId:possiblyOtherId:entireLoop">为了在<f:ajax render>中使用,请准确获取此客户端ID并为其添加前缀:。
<f:ajax ... render=":someId:possiblyOtherId:entireLoop" />如果它包含一个动态生成的ID,如j_id_123,那么您需要为所有父NamingContainer组件,如<h:form>,提供一个固定的ID,如<h:form id="someId">。
注意,引用像<table id="bidsTable">这样的普通HTML元素的客户机ID是的,而不是。它必须是一个像<h:dataTable id="bidsTable">一样完整的JSF组件。
https://stackoverflow.com/questions/9466977
复制相似问题