valueChangeListener et ajax ordre d'exécution problème sur selectOneMenu
Je suis actuellement confronté à un des phénomènes étranges, où la définition de la valeur pour le modèle qui se passe avant l'exécution de valueChangeListener.
Fondamentalement, ce que je voudrais arriver, c'est :
- - Je changer le menu select
- La nouvelle valeur sont soumis à l'aide d'Ajax pour mettre à jour le myBean (à l'aide de f:ajax)
- Exécuter une requête basée sur la nouvelle saisie de la valeur (à l'aide de valueChangeListener)
- Rendu de la table basée sur le résultat de la dernière requête
Mais ce qui se passe quand je lance c'est dans cet ordre, 1 - 3 - 2 - 4 (pas 1 - 2 - 3 - 4 comme je l'imaginais)
Voici la partie de l'INTERFACE utilisateur :
<h:selectOneMenu label="budget" id="budget"
converter="genericConverter"
value="#{myBean.budget}"
valueChangeListener="#{myBean.actionSearch}">
<f:ajax render="myGrid" />
<f:selectItem itemLabel="Choose one .." noSelectionOption="true" />
<f:selectItems ... />
</h:selectOneMenu>
Et c'est l'extrait de la fève :
public void actionSearch() {
System.out.println("searching with this.budget == " + this.budget);
...
}
public void setBudget(String budget) {
System.out.println("setting budget : " + budget);
this.budget = budget;
}
Et c'est la sortie :
searching with this.budget == xxxx
setting budget : yyyy
Ce que je voudrais, c'est, d'établissement du budget, d'abord à partir de la nouvelle valeur sélectionnée dans l'INTERFACE utilisateur, puis de lancer la recherche basée sur la nouvelle INTERFACE utilisateur. Mais je ne sais pas comment faire pour y parvenir.
Et im en utilisant Tomcat 7 avec ces :
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.0.4-b09</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.0.4-b09</version>
<scope>compile</scope>
</dependency>
Je me demande ce que j'ai fait de mal ?
Merci !
Vous devez vous connecter pour publier un commentaire.
La
valueChangeListener
est exécutée au cours de Validations phase, avant le Modèle de mise à Jour des Valeurs de phase. Il est destiné à être en mesure d'obtenir une poignée de les deux l'ancienne et la nouvelle valeur, de sorte que vous pouvez si nécessaire, de faire certains trucs (bois?) basé sur le réel changement. Dans JSF 1.x c'était cependant le plus souvent (ab)utilisé pour invoquer des actions sur un menu déroulant modifier uniquement, mais il doit être utilisé en combinaison aveconchange="submit()"
,immediate="true"
,FacesContext#renderResponse()
et d'autres animaux. La valeur sélectionnée est obtenue parValueChangeEvent#getNewValue()
(leValueChangeEvent
est censé être défini comme la méthode de l'argument).JSF 2.x vous n'avez pas besoin de la
valueChangeListener
plus dans ce cas. Vous n'êtes pas intéressé par l'ancienne valeur de toute façon. Utiliser lelistener
attribut de<f:ajax>
à la place.Ce sera exécutée lors de l'Invoquer la phase d'Action, après Modèle de mise à Jour des Valeurs de phase.