Primefaces p:calendrier avec p:ajax valeur non mises à jour (une étape de retard)
Je veux appeler un bean après une date est sélectionnée dans un p:calendar
. Dans ma configuration j'ai un @Named @ViewScoped
Bean, la classe ObWithDate
est un @Entity
avec un champ de date validFrom.
<h:form id="fUser">
<p:dataTable id="dt" var="cum" value="#{myBean.listObWithDates}">
<p:column>
<p:calendar id="cValidFrom" value="#{cum.validFrom}">
<p:ajax event="dateSelect" listener="#{myBean.update(cum)}"
update=":fUser:dt"/>
</p:calendar>
</p:column>
</p:dataTable>
</h:form>
La bonne chose est, que la méthode d'haricot update(ObWithDate myO)
est appelée avec le bon objet à chaque fois que je sélectionne une date. La mauvaise chose est que myO.validFrom
n'a pas la bonne valeur. C'est toujours un pas derrière:
- Champ initialisé avec 2012-01-01
- GUI changement de 2012-01-05, haricot méthode débogue à 2012-01-01
- GUI changement de 2012-01-15, haricot méthode débogue à 2012-01-05
Ce problème me rend fou, j'ai trouvé plusieurs problèmes avec pas correctement les valeurs mises à jour et aussi un peu sur p:calendar
. La plupart d'entre eux suggèrent d'utiliser l'attribut selectListener="#{calendarBean.handleDateSelect}"
avec un handleDateSelect(DateSelectEvent event)
méthode. Mais je veux appeler ma méthode, car je veux passer l'instance courante de la variable.
- Firebug de vérifier que la mise à jour correcte des valeurs sont transmises dans un message de demande de
- Je suis l'aide de Primefaces 3.2 et JBoss-7.1.1-Finale
- Même sans le
p:dataTable
, et en utilisant uniquementp:calendar
le problème est toujours le même. - La mal valeur de la sortie de débogage peut être observée pour la méthode de l'Objet-
update(ObWithDate myO)
aussi bien pour l'entrée correspondante dansmyBean.listObWithDates
. <p:ajax immediate="true" .../>
ne permet pas de résoudre ce problème.
Mise à jour MattHandy m'a beaucoup aidé, la question Comment correspondant à l'élément de liste dans de l'appel ajax à l'intérieur de la haricots méthode? est formulé dans le cadre du suivi JSF p:calendrier p:dataTable: Comment obtenir la ligne de p:ajax dateSelect événement.
- Notez que
@Named
et@ViewScoped
ne travaillent pas ensemble. CDI ne connaissent pas la portée de vue. Peut-être que ce n'est pas la raison de votre problème concret, mais peut provoquer un comportement indésirable, maintenant ou plus tard. - Je suis l'aide de Couture, qui améliore CDI avec cette portée (docs.jboss.org/seam/3/faces/latest/reference/en-US/html/...), cela fonctionne comme un charme sur plusieurs pages. C'est un pas en arrière, pas un seul jour de retard. - Je mettre à jour la question pour clarifier cela.
- Ce doit être un cycle de vie en question. La méthode setter est appelé avant l'auditeur exécute. Et l'auditeur définit la valeur de revenir à la valeur précédente.
- Oui, mais comment le résoudre? J'ai aussi essayé
p:ajax immediate="true"
sans succès. - J'ai eu le même problème avec
datatable
etcalendar
- utilisé pour le filtrage. Essayez d'ajouterwidgetVar
à votredatatable
et appel ajax comme ceci :<p:ajax event="dateSelect" update=":frmTable:idTable" oncomplete="tableWidgetVar.filter()"/>
. Bien que j'ai mis à jour la table avecupdate
j'avais besoin de forcer la mise à jour une fois de plus au - dessus du cycle de vie des problème. OMI, vous devez forcer la mise à jour une fois de plus trop.
Vous devez vous connecter pour publier un commentaire.
C'est probablement un cycle de vie en question. Le setter pour votre champ est appelé avant votre auditeur exécute. Vous ne devez pas utiliser le port d'écoute pour définir votre valeur.
L'expression el sur votre écouteur est évalué à rendre phase d'intervention de l' précédente demande donc qu'elle détient la
cum
valeur "un pas en arrière".Vous devez mettre à jour votre objet personnalisé à partir de l'accesseur du calendrier de la date de valeur.
myBean.update(cum)
mais seulementmyBean.update
. En faisant cela, j'ai toujours s'attendre à ce que lacum
danslistObWithDates
est définie lors de la requête ajax et j'ai des valeurs réelles dans les haricotsupdate()
méthode. Mais il y a le vieux ceux, aussi.public void update()
. Le problème est encore, que la valeur correcte n'est pas "déjà mis en" tandis qu'à l'intérieur de cette méthode. (Voir mon premier commentaire à votre réponse)event
si vous utilisez une sélection d'écoute comme décrit dans votre question avechandleDateSelect(DateSelectEvent event)
. Ou est le problème concret que vous ne connaissez pas la ligne de datatable où l'auditeur est appelé à partir de?Je suis tombé sur cette question aujourd'hui matin. Constaté que primefaces ont enlevé le DateSelectEvent de Primefaces 3.5 . Donc fallait supprimer l'ajax événement d'appeler à partir de mon calendrier de l'objet. Au lieu de la récupération de la valeur à l'aide de get..(). Veuillez trouver la discussion pour le même dans ce lien ci-dessous.
http://forum.primefaces.org/viewtopic.php?f=3&t=27590