2011-11-20 108 views
0

我需要显示拍卖物品的清单。当用户点击每个项目旁边的“出价”按钮时,我想让ajax在此拍卖项目下打开出价表单。所以我打算使用ui:repeatf:ajax(如下所示),但是当我进入页面时,所有拍卖项目都在其旁边打开了投标组件。点击任何按钮都不会执行任何操作。这是代码(与投标书格式简化到只是一个outputText:f:ajax在ui里面:重复

<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> 

我在做什么错?我怎样才能指定与点击拍卖项目相关的投标组件?

回答

2

如果我理解正确,您想要初始隐藏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); 
} 
+0

感谢您的回复,BalusC。其实我没有嵌套的形式,我说上面的代码只是简化了,因为我删除了表中的一些​​元素。简而言之,如果我可以使这个代码在上面工作,我会很好。所以我猜这个问题是:如何让页面在第一次呈现时不会出现在“bidView”元素中,并且只有在点击后才会出现点击拍卖? (这是一个总的新手问题,我敢肯定我错过了一些简单的东西。) – Herzog

+0

啊对了。你的问题始终是模棱两可的,你的错误尝试已经使我错误地理解你真正需要的东西(基本上,我知道你的情况下''没有做任何事情 - 这是不真实的)。我更新了答案。 – BalusC

+0

非常感谢您抽出时间,BalusC。它现在起作用,但只是部分。当我进入页面时,组件被隐藏起来。当我点击按钮时,显示正确的一个。到现在为止还挺好。但似乎isShowBidView正在为循环的每次迭代调用 - 直到我点击按钮的行。因此,例如,如果有4行,并且我点击第三行旁边的按钮,则会调用第一行,第二行和第三行的isShowBidView。前两项正确的错误,第三项正确的错误。这是怎么回事? – Herzog