我需要显示拍卖项目的列表。当用户点击旁边的出价按钮,每个项目,我想有ajax打开这个拍卖项目下的出价形式。所以我将使用ui:repeat
和f:ajax
,如下所示,但当我进入页面时,所有的拍卖项目旁边都打开了出价组件。点击任何按钮都没有任何作用。这是代码(投标表格简化为只有一个outputText:
)
<h:form>
<table border="1">
<ui:repeat var="parcel" varStatus="status" value="#{auctionsViewBean.parcels}">
<tr>
<td><h:commandButton value="Bid" action="nothing">
<f:ajax render="bidView"/>
</h:commandButton></td>
<td>#{status.index + 1}</td>
<td>#{parcel.a}</td>
<td>#{parcel.b}</td>
<td>#{parcel.c}</td>
</tr>
<tr><td><h:outputText id="bidView" value="#{auctionsViewBean.showBidViewForParcel(parcel)}">Some text</h:outputText></td></tr>
</ui:repeat>
</table>
</h:form>
我做错了什么?我怎样才能只指定与被点击的拍卖项目相关的出价组件?
如果我理解正确,您想最初隐藏bidView
直到按下按钮?你可以给它一个rendered
属性,然后把它放在另一个可以被<f:ajax>
引用的组件中。您只需要重新安排动作方法和检查逻辑。
<h:commandButton value="Bid" action="#{auctionsViewBean.addBidView(parcel)}">
<f:ajax render="bidView" />
...
<h:panelGroup id="bidView">
<h:panelGroup rendered="#{auctionsViewBean.showBidView(parcel)}">
...
</h:panelGroup>
</h:panelGroup>
,像这样:
public void addBidView(Parcel parcel) {
bidViews.put(parcel, new BidView());
}
public boolean isShowBidView(Parcel parcel) {
return bidViews.containsKey(parcel);
}