¿Cómo renderizar condicionalmente una etiqueta f: SelectItem?


Cómo puedo especificar una representación condicional para una etiqueta <f:selectItem>. Necesito mostrar las opciones <f:selectItem> de acuerdo con el estado de un usuario específico.

Por ejemplo, yo quería algo como:

<f:selectItem itemLabel="Yes! I need a girlfriend!"
             rendered="false(or some boolean condition)"
             itemValue="o1"/>
Author: Tiny, 2011-08-03

6 answers

El <f:selectItem> no soporta el atributo rendered. Su apuesta más cercana es el atributo itemDisabled que todavía muestra el objeto, pero lo hace no seleccionable. Esto también es soportado en <f:selectItems>.

En el caso de <p:selectOneMenu> puede agregar un poco de CSS para ocultar los elementos deshabilitados.

<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;
}

En el caso de <h:selectOneMenu> depende más de si el navegador web admite ocultar las opciones deshabilitadas a través de 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;
}

La alternativa del lado del servidor es traer un JSTL <c:if> alrededor del individuo <f:selectItem> para agregarlo conticionalmente a la vista de esta manera (asegúrese de estar al tanto de cómo funciona JSTL en JSF: JSTL en las facetas JSF2... tiene sentido?):

<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" />

O, simplemente podría rellenar dinámicamente un List<SelectItem> en el frijol de respaldo basado en las condiciones calculadas y enlazarlo con <f:selectItems>.

 49
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:17:17

La solución que uso es establecer el atributo itemDisabled y usar este CSS:

select option[disabled] { display: none; }

Pero necesita ser arreglado correctamente en JSF.

 5
Author: Roger Keays,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-09 06:41:42

Puede envolverlo en ui:fragment código:

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

Entonces item se renderizará solo cuando la codificación booleana sea true.

 3
Author: Gondy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-27 11:39:26

<c:if> para mí tampoco funciona si depende de la variable repetida de un ' componente (en la primera fase de compilación funciona pero usando ajax y actualizando la colección de for-each falla, mostrando algunos elementos dos veces y otros no)

Este es realmente un gran problema en JSF. Deshabilitar no siempre es una opción, y de esta manera se necesita mucho más código en el bean para abordar cosas tan "fáciles".

 3
Author: djmj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-19 11:02:10

Basándose en la respuesta de BalusC, es posible hacerlo sin una lista de frijoles de respaldo en versiones más recientes de JSF (estoy usando 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>

Lo envolví en un componente compuesto con algunos requisitos específicos. La parte relacionada con esta pregunta está usando f:selectItems con un valor de [] o [1]. Cuando su condición hace que use [] entonces se omitirá por completo, y cuando use [1] entonces pone en un solo elemento con los valores que desea.

 0
Author: Jon B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-06 15:18:17

Resolví mi problema haciendo esto

<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
Author: Everton Silva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-26 18:07:47