JSF rerender support avec selectBooleanCheckbox
Question
J'ai une page JSF sur laquelle je veux avoir une case à cocher, lorsque vous cliquez dessus ajouter / supprimer certains autres champs de formulaire de la page. Voici le code (simplifié) Je actuellement la case à cocher:
<h:selectBooleanCheckbox title="showComponentToReRender" value="#{backingBean.showComponentToReRender}">
<a4j:support event="onsubmit" reRender="componentToReRender" />
</h:selectBooleanCheckbox>
Voici le code pour le composant que je veux cacher:
<h:selectOneMenu id="componentToReRender" value="#{backingBean.value}" rendered="#{valuesList.rowCount>1 && backingBean.showComponentToReRender}">
<s:selectItems value="#{valuesList}" var="value"/>
</h:selectOneMenu>
À l'heure actuelle, en cliquant la case à cocher ne fait rien; que « selectOneMenu » ne va pas disparaître. Qu'est-ce que je fais mal?
La solution
Vous avez besoin d'envelopper le componentToReRender
soit:
<h:panelGroup id="componentToReRenderWrapper">
ou
<a4j:outputPanel id="componentToReRenderWrapper">
Ainsi, vous aurez effectivement:
<h:panelGroup id="componentToReRenderWrapper">
<h:selectOneMenu id="componentToReRender" value="#{backingBean.value}" rendered="#{valuesList.rowCount>1 && backingBean.showComponentToReRender}">
<s:selectItems value="#{valuesList}" var="value"/>
</h:selectOneMenu>
</h:panelGroup>
et changer le reRender="componentToReRenderWrapper"
au cas où vous utilisez panelGroup
ou de supprimer cet attribut, dans le cas où vous utilisez outputPanel
.
Nous avons trouvé l'explication exacte dans le RichFaces docs:
Le problème le plus commun avec l'aide rerender pointe au composant qui a un attribut « rendu ». Notez que JSF ne marque pas le lieu dans le navigateur DOM où le résultat du composant doit être placé dans le cas où le « rendu » condition retourne false. Par conséquent, après que le composant devient rendu lors de la demande Ajax, RichFaces délivre le code rendu au client, mais ne met pas à jour une page, car le lieu de mise à jour est inconnue. Vous devez pointer vers l'un des composants parent qui n'a pas d'attribut « rendu ». Comme alternative, vous pouvez envelopper le composant avec la mise en page = « none ».
Autres conseils
Ne pas oublier de mettre ajaxRendered = "true" sur le a4j: outputPanel