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"/>
Это нормальное поведение, или я пропускаю некоторые параметры?
Ответы
Ответ 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>
не поддерживает разделение запятой, и в противном случае пуск будет путать.