Comment rendre conditionnellement une étiquette f: selectItem?

Comment puis-je spécifier un rendu conditionnel pour une étiquette <f:selectItem> . Je dois afficher les options <f:selectItem> en fonction du statut de l'utilisateur.

par exemple, je voulais quelque chose comme:

<f:selectItem itemLabel="Yes! I need a girlfriend!"
             rendered="false(or some boolean condition)"
             itemValue="o1"/>
30
demandé sur Tiny 2011-08-03 23:18:40

6 réponses

l'attribut <f:selectItem> ne supporte pas . Votre pari le plus proche est l'attribut itemDisabled qui affiche toujours l'élément, mais le rend non sélectionnable. Ceci est également pris en charge dans <f:selectItems> .

dans le cas de <p:selectOneMenu> vous pouvez alors juste ajouter quelques CSS pour cacher des articles désactivés.

<p:selectOneMenu ... panelStyleClass="hideDisabled">
    <f:selectItem itemValue="1" itemLabel="one" />
    <f:selectItem itemValue="2" itemLabel="two" itemDisabled="#{some.condition}" />
    <f:selectItem itemValue="3" itemLabel="three" />
</p:selectOneMenu>
.ui-selectonemenu-panel.hideDisabled .ui-selectonemenu-item.ui-state-disabled {
    display: none;
}

dans le cas de <h:selectOneMenu> vous êtes plus dépendant si le webbrowser soutient Cacher les options handicapées via CSS:

<h:selectOneMenu ... styleClass="hideDisabled">
    <f:selectItem itemValue="1" itemLabel="one" />
    <f:selectItem itemValue="2" itemLabel="two" itemDisabled="#{some.condition}" />
    <f:selectItem itemValue="3" itemLabel="three" />
</h:selectOneMenu>
select.hideDisabled option[disabled] {
    display: none;
}

l'alternative côté serveur est d'introduire un JSTL <c:if> autour de l'individu <f:selectItem> pour l'ajouter contitionnellement à la vue comme ceci (assurez-vous que vous êtes au courant de la façon dont JSTL fonctionne dans JSF: JSTL dans les Facelets JSF2... du sens? ):

<f:selectItem itemValue="1" itemLabel="one" />
<c:if test="#{not some.condition}">
    <f:selectItem itemValue="2" itemLabel="two"  />
</c:if>
<f:selectItem itemValue="3" itemLabel="three" />

ou, vous pourriez simplement peupler dynamiquement un List<SelectItem> dans la fève de soutien basé sur les conditions calculées et le lient avec <f:selectItems> .

49
répondu BalusC 2017-05-23 12:17:17

la solution que j'utilise est de définir l'attribut itemDisabled et d'utiliser ce CSS:

select option[disabled] { display: none; }

mais il doit être correctement fixé dans JSF.

5
répondu Roger Keays 2012-05-09 06:41:42

vous pouvez l'envelopper dans ui:fragment code:

<ui:fragment rendered="false(or some boolean condition)">
  <f:selectItem itemLabel="Yes! I need a girlfriend!" itemValue="o1"/>
</ui:fragment>

alors l'élément ne sera rendu que lorsque la codition booléenne est vraie.

3
répondu Gondy 2015-02-27 11:39:26

<c:if> pour moi ne fonctionne pas non plus si elle dépend de la variable répétée d'un ` composant (sur la première phase de construction, il fonctionne mais en utilisant ajax et la mise à jour de la collection de la pour-chaque il échoue, montrant certains éléments deux fois et d'autres pas)

c'est vraiment un gros problème dans JSF. Désactiver n'est pas toujours une option, et de cette façon beaucoup plus de code est nécessaire dans le haricot pour traiter ces choses "faciles".

3
répondu djmj 2015-11-19 11:02:10

en se basant sur la réponse de BalusC, il est possible de le faire sans une liste de support dans les nouvelles versions de JSF (j'utilise JSF 2.2):

        <h:selectOneMenu id="Value" value="#{cc.attrs.value}">
            <f:selectItem itemLabel="#{cc.attrs.placeholder}" noSelectionOption="true">
                <f:passThroughAttribute
                    rendered="#{not empty cc.attrs.placeholder}"
                    name="hidden" value=""/>
            </f:selectItem>
            <f:selectItems value="#{empty cc.attrs.allLabel ? [] : [1]}"
                var="item"
                itemLabel="#{cc.attrs.allLabel}"
                itemValue="#{cc.attrs.allValue}"/>
            <f:selectItems value="#{cc.attrs.codeList}" var="code" itemLabel="#{code.codeDesc}" itemValue="#{code.userCode}"/>
        </h:selectOneMenu>

Je l'ai enveloppé dans un composant composite avec quelques exigences spécifiques. La partie liée à cette question utilise f:selectItems avec une valeur de [] ou [1] . Quand votre état le fait utiliser [] alors il sera entièrement omis, et quand il utilise [1] alors il met dans un seul élément avec les valeurs que vous voulez.

0
répondu Jon B 2018-03-06 15:18:17

j'ai résolu mon problème en faisant ceci

<p:selectOneRadio id="myId" value="#{myView.myProperty}">
<h:panelGroup rendered="#{myView.showMyOption}">
<f:selectItem itemLabel="My Option"     itemValue="0"  />
    </h:panelGroup>
    <f:selectItem itemLabel="My Option 1"   itemValue="1"  />
    <f:selectItem itemLabel="My Option 2"   itemValue="2"  />
<p:selectOneRadio
-1
répondu Everton Silva 2015-01-26 18:07:47