web-dev-qa-db-fra.com

Rendre sous condition un <ui: include>

J'essaie de basculer sur une page qui affiche un <rich:dataTable>. Avant, je venais d'inclure le modèle <ui:include> et il ne ferait que montrer la table tout le temps.

<ui:include src="../log/viewDlg.xhtml"/>

Maintenant, je veux pouvoir l'activer/le désactiver sur la page Web. Afficher sur la page avec peut-être un bouton ou un lien. Comment puis-je y arriver?


Mise à jour 1: Je ne parviens pas à le faire apparaître pour une raison étrange. Voici ce que j'ai écrit jusqu'à présent sur la base des commentaires

Vue:

<a4j:commandLink value="View"
    action="#{bean.showview}" render="viewPanel"/>

<h:panelGroup id="viewPanel">
    <h:panelGroup id="tableRenderPanel" rendered="#{bean.showPolicyView}">    
        <ui:include src="../log/viewDlg.xhtml"/>
    </h:panelGroup>                         
</h:panelGroup>

Haricot de sauvegarde:

private boolean showPolicyView = false;

public void showView() {
    showPolicyView = !showPolicyView;
}

public boolean isShowPolicyView(){
    return showPolicyView;
}
12
Gilbert V

Enveloppez votre <ui:include> dans deux éléments <h:panelGroup>. Il y a un piège ici, vous ne pouvez pas rendre un composant conditionnel. Pourquoi ça? En effet, lorsque l'attribut rendered de l'élément sera résolu en false, il ne sera pas pris en compte lors du rendu de la vue, il ne peut donc pas être la cible d'une opération (liée au rendu).

Sautant au code, vous aurez ceci:

<h:panelGroup id="wrapperPanel">
    <h:panelGroup id="tableRenderPanel" rendered="#{yourBean.renderTable}">
        <ui:include src="../log/viewDlg.xhtml"/>
    </h:panelGroup>
</h:panelGroup>

yourBean#renderTable est une propriété Boolean qui détermine si le composant sera rendu. Lorsqu'il évalue false, le composant n'est pas inclus dans l'arborescence des composants.


Basculer la vue

Pour basculer l'affichage, créez simplement une méthode de bean qui actualise la page.

<h:commandLink action="#{yourBean.toggleTableView}"/>

ou le panneau particulier via AJAX. Pour ce faire dans JSF 1.2, utilisez des extensions telles que RichFaces pour introduire AJAX, si vous le pouvez. Par exemple, si vous choisissez RichFaces, vous pouvez utiliser <a4j:commandLink/> et son attribut pratique render (ou reRender dans les versions antérieures) pour obtenir ce que vous pourriez faire normalement avec un <f:ajax/> dans JSF 2.

<a4j:commandLink action="#{yourBean.toggleTableView}" reRender="wrapperPannel"/>

Ou, une autre alternative est

<a4j:commandLink action="#{yourBean.toggleTableView}">
    <a4j:support event="oncomplete" reRender="wrapperPannel"/>
</a4j:commandLink>

Veuillez noter que l'attribut reRender peut varier en fonction de la structure de votre page, mais il doit toujours faire référence à l'id du panneau d'habillage à la fin. De plus, reRender a été renommé simplement render dans les dernières versions de RichFaces.

Donc, en supposant que vous ayez une propriété renderTable (getter + setter) dans yourBean, la toggleTableView doit la changer, afin de définir de manière dynamique si le composant doit être rendu ou non (renderTable = false).


Présentation de RichFaces

Vérifiez ce lien pour obtenir de l’aide pour la configuration de RichFaces dans votre projet. 

20
Fritz

J'aime mieux utiliser des gestionnaires de balises que d'insérer h:panelBoxes comme ici: 

<c:choose> <c:when test="#{myBean.yourCondition()}"> <ui:include src="viewA.xhtml"/> </c:when> <c:otherwise> <ui:include src="viewB.xhtml"/> </c:otherwise> </c:choose>

Avantage: Les gestionnaires de balises ne représentent pas des composants et ne font jamais partie de l'arborescence des composants une fois la vue créée. Cela n'interférera pas avec votre CSS - le h:panelBox, au contraire, insère un div ou un span.

Lorsque vous manipulez des gestionnaires de balises (comme tout c:xxx), assurez-vous de connaître la différence entre les composants d'interface utilisateur et les gestionnaires de balises . À savoir que les composants d'interface utilisateur et les gestionnaires de balises sont rendus dans différentes phases. Cela implique que vous ne pouvez pas créer une variable dans un composant composite et l'utiliser dans un gestionnaire de balises imbriqué. c:choose et ui:include sont tous les deux des gestionnaires de balises, donc normalement ce n'est pas un problème. Lisez le lien, c’est un exemple très court et très perspicace.

0