Comment rendre conditionnellement des éléments HTML simples comme s?

j'essaie d'implémenter un composant composite qui affiche les informations détaillées d'un utilisateur en texte clair ou les affiche dans des champs de textes éditables si les détails désirés sont ceux de l'utilisateur actuellement connecté.

je sais que tous les composants D'UI peuvent être rendus via l'attribut Rendu mais qu'en est-il de ceux qui ne sont pas des composants D'UI (par exemple divs)

<div class = "userDetails" rendered = "#{cc.attrs.value.id != sessionController.authUser.id}">
    Name: #{cc.attrs.value.name}
    Details: #{cc.attrs.value.details}
</div>

<div class = "userDetails" rendered = "#{cc.attrs.value.id == sessionController.authUser.id}">
    <h:form>
        ...
    </h:form>
</div>

je sais que le div n'a pas l'attribut rendu et probablement Je ne prends pas la bonne approche du tout. Je pourrais très facilement utiliser une étiquette JSTL mais je veux éviter cela.

20
demandé sur BalusC 2012-01-11 12:23:27
la source

4 ответов

le composant JSF droit pour représenter un élément HTML <div> est le <h:panelGroup> avec l'attribut layout défini à block . Donc, cela devrait faire:

<h:panelGroup layout="block" ... rendered="#{someCondition}">
    ...
</h:panelGroup>

sinon, l'envelopper dans un <ui:fragment> :

<ui:fragment rendered="#{someCondition}">
    <div>
        ...
    </div>
</ui:fragment>

notez que lorsque vous souhaitez mettre à jour un composant ajax Rendu conditionnellement, vous devriez être ajax-mettant à jour son composant parent à la place.

voir aussi:

44
répondu BalusC 2017-05-23 15:10:00
la source

je voudrais simplement envelopper votre HTML avec <h:panelGroup>

<h:panelGroup rendered = "#{cc.attrs.value.id != sessionController.authUser.id}">
    <div class = "userDetails">
        Name: #{cc.attrs.value.name}
        Details: #{cc.attrs.value.details}
    </div>
</h:panelGroup>

<h:panelGroup  rendered = "#{cc.attrs.value.id == sessionController.authUser.id}">
    <div class = "userDetails">
        <h:form>
           ...
        </h:form>
    </div>
</h:panelGroup>

une autre option consiste à utiliser les composants des bibliothèques Seam ( <s:div> ) ou Tomahawk ( <t:htmlTag> ) si vous les avez déjà dans votre projet.

voir: http://www.jsftoolbox.com/documentation/seam/09-TagReference/seam-div.html

<s:div styleClass = "userDetails" rendered = "#{cc.attrs.value.id != sessionController.authUser.id}">
    Name: #{cc.attrs.value.name}
    Details: #{cc.attrs.value.details}
</s:div>

<s:div styleClass = "userDetails" rendered = "#{cc.attrs.value.id == sessionController.authUser.id}">
    <h:form>
        ...
    </h:form>
</s:div>

ou: http://myfaces.apache.org/tomahawk-project/tomahawk12/tagdoc/t_htmlTag.html

<t:htmlTag value="div" styleClass = "userDetails" rendered = "#{cc.attrs.value.id != sessionController.authUser.id}">
    Name: #{cc.attrs.value.name}
    Details: #{cc.attrs.value.details}
</t:htmlTag>

<t:htmlTag value="div" styleClass = "userDetails" rendered = "#{cc.attrs.value.id == sessionController.authUser.id}">
    <h:form>
        ...
    </h:form>
</t:htmlTag>
8
répondu DRCB 2012-01-11 13:21:22
la source

cela a été facile depuis JSF 2.2. En utilisant des éléments de passage, n'importe quel élément HTML peut être converti en un composant JSF, qui a l'attribut Rendu.

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:jsf="http://xmlns.jcp.org/jsf">
    <div class="userDetails" jsf:rendered="#{cc.attrs.value.id != sessionController.authUser.id}">
        Name: #{cc.attrs.value.name}
        Details: #{cc.attrs.value.details}
    </div>
</html>

plus d'informations à https://jsflive.wordpress.com/2013/08/08/jsf22-html5/#elements

7
répondu tuner 2016-04-02 05:47:21
la source

vous pouvez utiliser un autre composant composite. Il n'y a pas de divs ou d'autres tags supplémentaires, juste exactement celui dont vous avez besoin. Voir cet exemple:

<table>
    <tr>...</tr>
    <my:cc rendered="false">
        <tr>...</tr>
    </my:cc>
    <my:cc rendered="true">
        <tr>...</tr>
    </my:cc>
</table>

et le composant my:cc:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:cc="http://xmlns.jcp.org/jsf/composite">

    <cc:interface>
    </cc:interface>

    <cc:implementation>
        <cc:insertChildren />
    </cc:implementation>
</html>

produit HTML suivant, aucune étiquette supplémentaire du tout, en travaillant avec ajax.

<table><tr>...</tr><tr>...</tr></table>
0
répondu Pavel Sedek 2015-06-16 02:49:28
la source

Autres questions sur html jsf-2 conditional-rendering