JSF(Primefaces)通过ID更新多个元素的ajax操作

33

关于JSF,特别是Primefaces还有一个问题。在同一时间使用id更新元素时遇到了以下问题。如果页面上的元素一个接一个地进行更新,那么ajax更新将正常执行:

<ui:repeat value="#{showProducts.inCart}" var="cart">
 <td><p:spinner min="0" value="#{cart.count}" immediate="true">
 <p:ajax process="@this" update="count,subTotal"/></p:spinner></td>         
 <td><h:outputText value="#{cart.totalPrice}" id="count"/></td>
 <h:outputText value="#{showProducts.subTotal}" id="subTotal"/>      
</ui:repeat>

首先是具有"id=count"的元素,其次是具有"id=subtotal"的元素。 如果页面上的元素不是严格按顺序排列,那么具有"id=subtotal"的第二个元素将不会更新:

    <ui:repeat value="#{showProducts.inCart}" var="cart">
      <td><p:spinner min="0" value="#{cart.count}" immediate="true">
<p:ajax process="@this" update="count,subTotal"/></p:spinner></td>         
      <td><h:outputText value="#{cart.totalPrice}" id="count"/></td>
      <td><h:outputText value="#{cart.place}" /></td>
    </ui:repeat>
    <h:outputText value="#{showProducts.subTotal}" id="subTotal"/> 

这是正常行为还是我缺少某些参数?

1个回答

70
如果要更新的组件不在同一个NamingContainer 组件(例如 ui:repeath:formh:dataTable等)中,则需要指定“绝对”客户端ID。在前面加上:(默认为NamingContainer分隔符字符)从根开始。
<p:ajax process="@this" update="count :subTotal"/>

为了确保,请检查生成的HTML中subTotal组件的客户端ID以获取实际值。如果它也在例如h:form中,则其前缀也是其客户端ID,您需要相应地进行修复。

<p:ajax process="@this" update="count :formId:subTotal"/>

更建议使用空格分隔ID,因为<f:ajax>不支持逗号分隔,并且初学者可能会感到困惑。


我在另一种情况下遇到了 java.lang.IllegalArgumentException: masterp:ajax update=":master" 位于 ui:include 中,而该 ui:include 又包含在 p:panelGrid id="master" 标签内。 - Roland
我认为我最好创建一个新的帖子? - Roland
您的上下文不清晰,请前往 https://dev59.com/62oy5IYBdhLWcg3wUcVL 以获取更好的解答。 - BalusC
我已经修复了它,通过完全避免在我的ID前面使用:master:。 :-) - Roland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接