Лучшая ставка - Томагавк <t:selectOneRadio>
с атрибутом layout
, установленным на spread
. Это дает дополнительное преимущество, заключающееся в том, что вы сможете расположить отдельные переключатели в разметке HTML так, как вы хотите, используя <t:radio>
, в отличие от стандартного <h:selectOneRadio>
, который поддерживает только layout
атрибуты pageDirection
и lineDirection
и отображает таблицу.
Однако, играя с вашими функциональными требованиями с помощью новой новой библиотеки Tomahawk для JSF 2.0 и добавляя функциональность <f:ajax>
, чтобы иметь возможность отключать / включать необходимые компоненты с помощью аксиальных возможностей, я, к сожалению, столкнулся с ошибкой в Tomahawk. Внутри <t:selectOneRadio>
<f:ajax>
неправильно отображает свой идентификатор клиента вместо одного из <t:radio>
в качестве аргумента для вызова ajax, который вызвал прерывание функции ajax. Я сообщил об этом как Томагавк выпуск 1551 .
Я не вижу других чистых решений для выполнения этого сложного (по крайней мере, в терминах компонентов JSF) требования. Пока ребята из Томагавка не исправят это, лучше всего ввести временный обходной путь на основе JS, чтобы исправить неверный аргумент для вызова ajax во время загрузки. Для вашей информации, вот как будет выглядеть форма:
<style>li { list-style-type: none; }</style>
...
<h:form>
<t:selectOneRadio id="tasks" value="#{bean.task}" layout="spread">
<f:selectItems value="#{bean.tasks}" />
<f:ajax event="click" render="@form" />
</t:selectOneRadio>
<ul>
<li><t:radio for="tasks" index="0" /></li>
<li><t:radio for="tasks" index="1" />
<t:selectOneRadio id="processes" value="#{bean.process}" layout="spread" disabled="#{bean.task != 'task2value'}">
<f:selectItems value="#{bean.processes}" />
<f:ajax event="click" render="@form" />
</t:selectOneRadio>
<ul>
<li><t:radio for="processes" index="0" /></li>
<li><t:radio for="processes" index="1" /></li>
<li><t:radio for="processes" index="2" />
<h:inputText value="#{bean.otherProcess}" disabled="#{bean.process != 'process3value'}" />
</li>
</ul>
</li>
<li><t:radio for="tasks" index="2" />
<ul>
<li><h:inputText value="#{bean.brand1}" disabled="#{bean.task != 'task3value'}" /></li>
<li><h:inputText value="#{bean.brand2}" disabled="#{bean.task != 'task3value'}" /></li>
</ul>
</li>
</ul>
</h:form>
Жаль, что стандартная реализация JSF не поддерживает такой гибкий компонент радиокнопки.