3 votes

Utilisation de l'événement onchange de a4j:support avec h:selectOneMenu

<h:selectOneMenu id="selectOneMenu"  value="#{Bean1.val1}" >
    <f:selectItems value="#{Bean1.selectItems}"/>
    <a4j:support event="onchange" action="#{Bean1.onSelectOneMenuChange}" reRender="textbox1 , textbox2 , textbox3, textbox4"  />
 </h:selectOneMenu>

<h:inputText id="textbox1" value="#{Bean1.textbox1}"> </h:inputText>
<h:inputText id="textbox2" value="#{Bean1.textbox2}"> </h:inputText>
<h:inputText id="textbox3" value="#{Bean1.textbox3}"> </h:inputText>
<h:inputText id="textbox4" value="#{Bean1.textbox4}"> </h:inputText>

Bean1.onSelectOneMenuChange() modifiera la valeur de Bean1.textbox1 , Bean1.textbox2 , Bean1.textbox3 y Bean1.textbox4 (en fonction de la valeur choisie (Bean1.val1) ). Parfois, il modifie toutes les valeurs de la zone de texte et parfois il ne modifie que certaines valeurs de la zone de texte.

Lorsque les utilisateurs modifient la valeur du contrôle de liste déroulante "selectOneMenu", le cadre JSF n'appelle pas la phase de mise à jour des valeurs du modèle, mais la phase de mise à jour des valeurs de la liste déroulante "selectOneMenu". Bean1.onSelectOneMenuChange() directement. Ensuite, toutes les zones de texte sont redessinées. Comme la phase de mise à jour des valeurs du modèle n'est pas appelée, les valeurs saisies par l'utilisateur ne sont jamais définies dans le Bean1 et la valeur originale est affichée dans la boîte de texte après la phase de mise à jour des valeurs du modèle. reRender .

J'ai envie de demander :

  1. Comment puis-je appeler manuellement la phase de mise à jour des valeurs du modèle à l'intérieur de l'application ? Bean1.onSelectOneMenuChange() ? Comment puis-je obtenir la valeur saisie par les utilisateurs à l'intérieur de l'application ? Bean1.onSelectOneMenuChange() et lui attribuer les champs correspondants du Bean1 ?

  2. Une autre approche consiste à ne re-rendre que les zones de texte dont les valeurs sont mises à jour dans le Bean1.onSelectOneMenuChange(). Par exemple, une valeur changera toutes les valeurs de la boîte de texte et une valeur ne changera que certaines valeurs de la boîte de texte. reRender sous conditions ? Quelle méthode est préférable pour la maintenabilité ?

Mise à jour :

Pour le point 2, je trouve que les propriétés de reRender peuvent accepter l'expression EL, j'ai donc essayé d'utiliser

 <a4j:support event="onchange"  action="#{Bean1.onSelectOneMenuChange}" reRender="#{Bean1.reRenderIDList}"  /> .

Dans le Bean1.onSelectOneMenuChange(), j'ai défini le Bean1.reRenderIDList à un ensemble d'ID qui doivent être re-rendus en fonction de l'exigence de l'entreprise. La liste de Bean1.reRenderIDList Bean1.getRenderIDList() s'exécute lorsque la page est rafraîchie. Cependant, lorsque je modifie la valeur de <h:selectOneMenu> dans l'interface utilisateur, Bean1.getRenderIDList() ne sera plus jamais exécuté. Ainsi, la zone de texte ne peut pas être reRender ?

Une idée ?

1voto

Max Katz Points 1377

Votre code semble correct. Il n'y a aucune raison pour que la phase de mise à jour du modèle ne se produise pas (vous n'utilisez pas la fonction immediate=true ). Et si vous avez une erreur de conversation/validation, l'action ne sera jamais appelée. Vérifiez les phases par lesquelles vous passez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X