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