Подтвердить что ты не робот

JSF (Primefaces) ajax обновление нескольких элементов по идентификаторам

Еще один вопрос, касающийся JSF. В частности, Primefaces.
У вас есть следующая проблема с обновлением ajax элементов по 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" занимает второе место. В случае, если элементы на странице не являются строго по одному, второй элемент с "промежуточным" идентификатором не обновляется:

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

Это нормальное поведение, или я пропускаю некоторые параметры?

4b9b3361

Ответ 1

Если компонент, подлежащий обновлению, не находится внутри одного компонента NamingContainer (ui:repeat, h:form, h:dataTable и т.д.), вам нужно указать "абсолютный" идентификатор клиента. Префикс с : (символ разделителя по умолчанию NamingContainer), начиная с root.

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

Конечно, проверьте идентификатор клиента компонента subTotal в сгенерированном HTML для фактического значения. Если он внутри, например, h:form, то он также имеет префикс с его идентификатором клиента, и вам нужно будет исправить его соответствующим образом.

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

Пространственное разделение идентификаторов более рекомендуется, так как <f:ajax> не поддерживает разделение запятой, и в противном случае пуск будет путать.