33

还有一个关于 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"/> 

这是正常行为还是我错过了一些参数?

4

1 回答 1

69

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

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

可以肯定的是,subTotal在生成的 HTML 中检查组件的客户端 ID 以获取实际值。如果它也在内部,例如 a h:form,那么它也以它的客户端 ID 为前缀,您需要相应地修复它。

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

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

于 2010-12-17T21:22:02.150 回答