【问题标题】:f:ajax inside ui:repeatf:ajax 里面的 ui:repeat
【发布时间】:2012-01-02 08:25:41
【问题描述】:

我需要出示一份拍卖品清单。当用户单击每个项目旁边的投标按钮时,我想让 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>

我做错了什么?以及如何仅指定与点击的拍卖项目相关的出价组件?

【问题讨论】:

    标签: jsf jsf-2 uirepeat


    【解决方案1】:

    如果我理解正确,您想在按下按钮之前隐藏bidView?你可以通过给它一个rendered 属性来做到这一点,并将它放在另一个可以被&lt;f:ajax&gt; 引用的组件中。您只需要重新排列动作方法和检查逻辑即可。

    <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);
    }
    

    【讨论】:

    • 感谢您的回复,BalusC。其实我没有嵌套表格,我说上面的代码只是因为我删除了表格中的一些 元素而简化了。简而言之,如果我能让这段代码在上面工作,我会很好。所以我想问题是:如何让“bidView”元素在页面最初呈现时不存在,并且只在点击后出现在点击的拍卖中? (这完全是一个新手问题,我敢肯定我在这里遗漏了一些简单的东西......)
    • 对了。你的问题毕竟是模棱两可的,你的错误尝试让我走上了理解你真正需要的错误轨道(基本上,我明白在你的情况下&lt;f:ajax&gt; 没有做任何事情——这是不真实的)。我更新了答案。
    • 非常感谢您抽出宝贵的时间,BalusC。它现在有效,但只是部分有效。当我转到页面时,组件被隐藏了。当我单击按钮时,会显示正确的按钮。到目前为止,一切都很好。但似乎 isShowBidView 正在为循环的每次迭代调用 - 直到我单击按钮的行。因此,例如,如果有 4 行,并且我单击第三行旁边的按钮,则会为第一行、第二行和第三行调用 isShowBidView。前两个是正确的,第三个是正确的,也是正确的。怎么回事?
    • 此外,随后点击页面上的任何 Bid 按钮似乎会从循环中的所有行对 isShowBidView 产生多次调用(准确地说是 7 次调用)。是否正在生成多个auctionsView.xhtml 组件?我在这里不知所措。
    • rendered 属性确实在单个组件上被多次调用。有关详细说明,请参阅 stackoverflow.com/questions/4281261/… 这就是为什么这些调用应该便宜(即不要在 getter 中执行任何业务逻辑或数据库访问)如此重要的原因。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签