JSF 2.3 с атрибутом group
Согласно спецификации JSF 329 Я добавил новый атрибут group
к <h:selectOneRadio>
, который должен сделать все это гораздо менее утомительным.Все компоненты переключателя, имеющие одинаковое значение group
в родительском UIForm
, будут сгруппированы друг с другом.Также они не будут отображать никакой разметки, кроме самой радиокнопки и необязательной метки, если выбранный элемент имеет ненулевое значение label
.Если имеется, метка появляется сразу после переключателя.
<!-- Just markup them the way you want! -->
<ul>
<ui:repeat id="items" value="#{bean.items}" var="item">
<li>
<h:selectOneRadio group="foo" value="#{bean.selectedItem}">
<f:selectItem itemValue="#{item}" />
</h:selectOneRadio>
</li>
</ui:repeat>
</ul>
Возможны также следующие сценарии.Если имеется несколько компонентов с одинаковым group
, а атрибут value
и / или дочерний элемент UISelectItem
отсутствуют, он будет ссылаться на компоненты первого компонента группы.
<h:selectOneRadio group="foo" value="#{bean.selectedItem}">
<f:selectItems value="#{bean.availableItems}" />
</h:selectOneRadio>
<h:selectOneRadio group="foo" />
<h:selectOneRadio group="foo" />
<h:selectOneRadio group="foo" value="#{bean.selectedItem}">
<f:selectItem itemValue="one" />
<f:selectItem itemValue="two" />
<f:selectItem itemValue="three" />
</h:selectOneRadio>
<h:selectOneRadio group="foo" />
<h:selectOneRadio group="foo" />
<h:selectOneRadio group="foo" value="#{bean.selectedItem}">
<f:selectItem itemValue="one" />
</h:selectOneRadio>
<h:selectOneRadio group="foo">
<f:selectItem itemValue="two" />
</h:selectOneRadio>
<h:selectOneRadio group="foo">
<f:selectItem itemValue="three" />
</h:selectOneRadio>
<h:selectOneRadio group="foo" value="#{bean.selectedItem}">
<f:selectItem itemValue="one" />
</h:selectOneRadio>
<h:selectOneRadio group="foo" value="#{otherBean.selectedItem}">
<f:selectItem itemValue="two" />
</h:selectOneRadio>
<h:selectOneRadio group="foo" value="#{lastBean.selectedItem}">
<f:selectItem itemValue="three" />
</h:selectOneRadio>
Будет доступно в Мохарре в соответствии с 2.3.0-m07.
JSF 2.2 со сквозной передачейelements
Если вы уже используете JSF 2.2, используйте его новую функцию passthrough elements / attribtues , посредством которой вы явно устанавливаете атрибут name
в качестве атрибута passthrough.Чтобы установить отправленное значение в модели, вам понадобятся только дополнительные <h:inputHidden>
.
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:jsf="http://xmlns.jcp.org/jsf"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:a="http://xmlns.jcp.org/jsf/passthrough">
...
<!-- Just markup them the way you want! -->
<ul>
<ui:repeat id="items" value="#{bean.items}" var="item">
<li>
<input type="radio" jsf:id="item" a:name="#{hiddenItem.clientId}"
value="#{item}" a:checked="#{item eq bean.selectedItem ? 'checked' : null}" />
<h:outputLabel for="item" value="#{item}" />
</li>
</ui:repeat>
</ul>
<!-- This one won't display anything. -->
<h:inputHidden id="selectedItem" binding="#{hiddenItem}" value="#{bean.selectedItem}"
rendered="#{facesContext.currentPhaseId.ordinal ne 6}" />
Подробное техническое объяснение можно найти в этом блоге: Пользовательский макет с h: selectOneRadio inJSF 2.2 .
PrimeFaces (JSF 2.x)
Если вам случится использовать PrimeFaces , то вы также можете использовать <p:selectOneRadio layout="custom">
с <p:radioButton>
.
<html ... xmlns:p="http://primefaces.org/ui">
<!-- This one won't display anything. -->
<p:selectOneRadio id="foo" value="#{bean.selectedFoo}" layout="custom">
<f:selectItems value="#{bean.availableFoos}" />
</p:selectOneRadio>
<!-- Just markup them the way you want! -->
<ul>
<li><p:radioButton for="foo" itemIndex="0" /></li>
<li><p:radioButton for="foo" itemIndex="1" /></li>
<li><p:radioButton for="foo" itemIndex="2" /></li>
</ul>
Вы также можете циклически перебирать доступные элементы, делать это нужно только во время просматривать время сборки :
<ul>
<c:forEach items="#{bean.availableFoos}" varStatus="loop">
<li><p:radioButton for="foo" itemIndex="#{loop.index}" /></li>
</c:forEach>
</ul>
Томагавк (JSF 1.x или 2.x)
Если вы еще не используете JSF 2.2 или вам не нравится интерфейс PrimeFaces, возьмите Томагавка <t:selectOneRadio>
, который отображает тот же простой вывод HTML, что и <h:selectOneRadio>
, но поддерживает атрибут layout="spread"
, так что вы можете расположить элементы на <t:radio>
так, как вы хотите.
Например:
<html ... xmlns:t="http://myfaces.apache.org/tomahawk">
<!-- This one won't display anything. -->
<t:selectOneRadio id="foo" value="#{bean.selectedFoo}" layout="spread">
<f:selectItems value="#{bean.availableFoos}" />
</t:selectOneRadio>
<!-- Just markup them the way you want! -->
<ul>
<li><t:radio for="foo" index="0" /></li>
<li><t:radio for="foo" index="1" /></li>
<li><t:radio for="foo" index="2" /></li>
</ul>
Пользовательский рендер
Предоставить пользовательский Renderer
.Это только немного работы.Начните с первой ссылки «См. Также», показанной ниже:
См. Также: