2010-05-12 6 views
3
<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() va changer la valeur de Bean1.textbox1, Bean1.textbox2, Bean1.textbox3 et Bean1.textbox4 (en fonction de la valeur sélectionnée (Bean1.val1)). Parfois, il va changer toute la valeur de la zone de texte et parfois il ne changera que la valeur de la zone de texte.En utilisant a4j: événement onchange de soutien avec h: selectOneMenu

Lorsque les utilisateurs modifient la valeur dans le contrôle de liste déroulante "selectOneMenu", l'infrastructure JSF n'appelle pas la phase de mise à jour des valeurs de modèle mais appelle directement le Bean1.onSelectOneMenuChange(). Après cela, tous les textbox sont reRender. Étant donné que la phase de mise à jour des valeurs du modèle n'est pas appelée, les valeurs entrées par l'utilisateur ne sont jamais définies sur le Bean1 et la valeur d'origine est affichée dans la zone de texte après reRender.

Je veux demander:

  1. Comment puis-je appeler manuellement le modèle de mise à jour des valeurs de phase à l'intérieur Bean1.onSelectOneMenuChange()? Comment puis-je obtenir l'entrée de valeur entrée par les utilisateurs à l'intérieur Bean1.onSelectOneMenuChange() et le définir dans les champs correspondants du Bean1?

  2. Une autre approche est que seulement reRender ces textbox dont les valeurs sont mises à jour dans le Bean1.onSelectOneMenuChange(). Cependant, il y a beaucoup de cas. Par exemple, une valeur changera toute la valeur de la zone de texte et une valeur ne changera que la valeur de la zone de texte. Comment puis-je modifier reRender sous condition? Quelle méthode préfère plus pour la maintenabilité?

Mise à jour:

Pour le point 2, je trouve que les preperties rerender du peut accepter l'expression EL, alors j'ai essayé d'utiliser

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

A l'intérieur du Bean1.onSelectOneMenuChange() , Je définis le Bean1.reRenderIDList à un ensemble d'ID qui doit être reRender en fonction des besoins de l'entreprise. Le Bean1.getRenderIDList() s'exécute lorsque la page est actualisée. Toutefois, 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?

Répondre

1

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 immediate=true). Et si vous aviez une erreur de conversation/validation, l'action ne serait jamais appelée. Vérifiez les phases que vous traversez.

+0

Oui, il existe quelques qui affectent une fonction de script Java aux propriétés onblur pour effectuer une validation. Comment puis-je contourner la phase de validation pour ces événements onchange ? Je veux faire une telle validation seulement quand l'utilisateur remplit toutes les données et appuie sur le bouton soumettre. Merci! –

+0

^^^ Pour ceux qui cherchent à limiter ce qui est envoyé, essayez de mettre l'attribut 'ajaxSingle' à' true' http://livedemo.exadel.com/richfaces-demo/richfaces/ajaxAttributes.jsf?c=ajaxattributs&tab=usage – Adam

Questions connexes