2011-07-25 4 views
1

J'essaie d'afficher une page où l'utilisateur, par la sélection appropriée en utilisant un bouton radio, voit soit une zone de texte ou une zone de liste déroulante. Ceci est relativement facile et je réussi à le faire par le code suivant:Ajax, rendu conditionnel et support beans

<h:selectOneRadio id="selection" value="#{inputMethod.choice}"> 
    <f:selectItem itemValue="#{inputMethod.TEXT}" itemLabel="textbox"/> 
    <f:selectItem itemValue="#{inputMethod.COMBO}" itemLabel="combobox" /> 
    <f:ajax event="click" execute="@this" render="@form" /> 
</h:selectOneRadio> 
<h:panelGroup id="Textbox" rendered="#{inputMethod.choice==inputMethod.TEXT}"> 
    <h:outputLabel>Textbox:</h:outputLabel> 
    <h:inputText value="#{myBean.somevalue}" /> 
</h:panelGroup> 
<h:panelGroup id="Combobox" rendered="#{inputMethod.choice==inputMethod.COMBO}"> 
    <h:outputLabel Combobox:/> 
    <h:selectManyListbox id="CommunityListbox" value="#{myBean.choices}"> 
    <f:selectItems value="#{myBean.selections}" var="u" itemValue="#{u.id}" itemLabel="#{u.name}"/> 
    </h:selectManyListbox> 
</h:panelGroup> 

Le problème que j'ai est que le poseur de la zone de liste déroulante est jamais appelée. En fait, le setter n'est appelé que pour le composant rendu par défaut (dans ce cas, inputMethod.choice==inputMethod.TEXT). Si j'enlève le rendu conditionnel, tous les setters sont appelés comme on pourrait s'y attendre.

Toutes les idées ou réponses seront grandement appréciées!

PS: J'utilise jsf2.0, Glassfish 3.1, Netbeans 7.0 (dans le cas où cela est d'une importance)

Répondre

1

Vous devez vous assurer que #{inputMethod.choice} évalue exactement la même lors de la demande de traitement du formulaire soumettre comme il l'a fait lors de la demande d'affichage du formulaire. Le plus simple est de placer le bean dans la portée de la vue ou de déplacer la logique d'initialisation dans le constructeur (post) du bean de la portée de la requête.