Utilisation de PF 3.0-RC1 Snapshot (22/11/2011)
J'ai un dans un composant composite. Je veux appeler valueChangeListener lorsqu'une sélection est effectuée, mais il ne semble pas appeler l'écouteur.
Voici le code du composant:
<p:selectOneMenu style="width: 220px;"
value="#{customerProfileSessionBean.selectedAccount}"
valueChangeListener="#{customerProfileSessionBean.accountValueChange}" >
<f:selectItems value="#{sessionBean1.custAccountList}"/>
</p:selectOneMenu>
L'écouteur dans le bean de sauvegarde a une instruction d'impression qui n'est pas appelée (au moins, je ne la vois pas dans le journal du serveur).
Y a-t-il autre chose que je dois faire pour obtenir l'appel de valueChangeListener lorsque la valeur change? Dois-je utiliser?
De plus, dans l'écouteur, y a-t-il un ValueChangeEvent passé?
Merci.
Vous semblez vous attendre à ce que la méthode valueChangeListener
côté serveur soit appelée immédiatement lorsqu'un événement de modification se produit côté client. Ce n'est pas correct. Il ne sera invoqué que lorsque le formulaire est soumis au serveur et que la nouvelle valeur ne _ equals()
pas l'ancienne valeur.
Il existe au moins deux façons d'atteindre votre exigence fonctionnelle:
Ajoutez onchange="submit()"
pour que JavaScript soumette le formulaire chaque fois que vous modifiez la valeur:
<p:selectOneMenu style="width: 220px;"
value="#{customerProfileSessionBean.selectedAccount}"
valueChangeListener="#{customerProfileSessionBean.accountValueChange}"
onchange="submit()">
<f:selectItems value="#{sessionBean1.custAccountList}"/>
</p:selectOneMenu>
C'est cependant très JSF-1.x-ish et pauvre pour l'expérience utilisateur. Il soumettra également (et convertira/validera!) Tous les autres champs de saisie qui peuvent ne pas être ce que vous voulez.
Utilisez plutôt un écouteur ajax, bien sûr si vous n'êtes pas intéressé par le changement de valeur réel (c'est-à-dire que l'ancienne valeur n'est pas intéressante pour vous), mais vous êtes réellement intéressé par l'événement de changement lui-même. Vous pouvez le faire en utilisant <f:ajax>
ou dans les composants PrimeFaces à l'aide de <p:ajax>
:
<p:selectOneMenu style="width: 220px;"
value="#{customerProfileSessionBean.selectedAccount}">
<p:ajax listener="#{customerProfileSessionBean.accountValueChange}" />
<f:selectItems value="#{sessionBean1.custAccountList}"/>
</p:selectOneMenu>
Et remplacez l'argument ValueChangeEvent
par l'argument AjaxBehaviorEvent
.
Ajoutez l'instruction f: ajax pour p: selectOneMenu, cela créera un appel ajax et votre valeur sera soumise EX:
<p:selectOneMenu style="width: 220px;" value="#
{customerProfileSessionBean.selectedAccount}"
valueChangeListener="#{customerProfileSessionBean.accountValueChange}" >
<f:selectItems value="#{sessionBean1.custAccountList}"/>
<f:ajax render="@form"/>
</p:selectOneMenu>
Ou vous pouvez fournir un identifiant de panneau ou un identifiant datatable, si vous ne voulez pas rendre le formulaire entier, comme:
<f:ajax render=":formid:panelGroupId"/>