web-dev-qa-db-fra.com

Mise à jour ajax JSF (Primefaces) de plusieurs éléments par ID

Encore une question concernant JSF, notamment Primefaces.
Avoir le problème suivant avec la mise à jour ajax des éléments par id en même temps. Si les éléments de la page vont un par un, cette mise à jour ajax fonctionne correctement:

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

Ici l'élément avec l'id "count" va en premier, puis l'élément avec l'id "subtotal" va en second. Dans le cas où les éléments de la page ne sont pas strictement un par un, ce deuxième élément avec l'ID "sous-total" n'est pas mis à jour:

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

Est-ce un comportement normal ou certains paramètres me manquent?

32
sergionni

Si le composant à mettre à jour n'est pas à l'intérieur du même composant NamingContainer (ui:repeat, h:form, h:dataTable, etc.), vous devez alors spécifier l'ID client "absolu". Préfixe avec : (le caractère de séparation par défaut NamingContainer) pour démarrer à partir de la racine.

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

Pour être sûr, vérifiez l'ID client du composant subTotal dans le code HTML généré pour la valeur réelle. Si c'est à l'intérieur par exemple un h:form également, il est également préfixé avec son ID client et vous devrez le corriger en conséquence.

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

La séparation d'espace des identifiants est plus recommandée car <f:ajax> ne prend pas en charge la séparation par virgule et les démarreurs seraient autrement confus.

68
BalusC