JSF(Primefaces)按ID更新几个元素的ajax

时间:2010-12-17 21:12:45

标签: ajax jsf primefaces

关于JSF的另一个问题。特别是Primefaces 有id的ajax同时更新元素有以下问题。 如果页面上的元素一个接一个,则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的第二个元素不会更新:

    <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 个答案:

答案 0 :(得分:68)

如果要更新的组件不在同一个NamingContainer组件(ui:repeath:formh:dataTable等)内,那么您需要指定“绝对”客户ID。带有:(默认NamingContainer分隔符)的前缀从root开始。

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

要确保,请在生成的HTML中检查实际值的subTotal组件的客户端ID。如果它也在内部,例如h:form,那么它的前缀也是它的客户端ID,你需要相应地修复它。

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

更推荐使用空格分隔ID,因为<f:ajax>不支持逗号分隔,否则初学者会感到困惑。