2010-10-13 6 views
1

мне нужно портировать приложение из PHP в JSF 2. Все хорошо для довольно сложной группы переключателей, за исключением:JSF комплекс каскадные радиокнопки

alt text

Когда «Process Application для:» выбран , активирована группа переключателей дочерних элементов. В этом случае, когда выбрано «Другое», соответствующее текстовое поле включено. Когда выбрано «Бренды», эти два текстовых поля включены. Разумеется, отмена выбора любого из них снова отключает соответствующие теги.

Я не могу придумать никакого способа сделать это, за пределами 3 отдельных <h:selectOneRadioButton /> тегов, с тонной обработкой javascript, отключением/включением тегов и т. Д. Обработка javascript, выбор/отмена выбора между различными переключателями, чтобы они отображались быть одной группой переключателей. Может ли кто-нибудь подумать о лучшем решении, чем это? Что-то вроде обычай <h:selectItem />?

Благодаря

ответ

3

Ваш лучший выбор: Tomahawk's<t:selectOneRadio> с layout атрибут установлен в spread. Это дает дополнительное преимущество в том, что вы сможете расположить отдельные переключатели в HTML-разметке так, как вы хотите, используя <t:radio>, в отличие от стандартного <h:selectOneRadio>, который поддерживает только атрибуты pageDirection и lineDirection и отображает таблицу.

Однако, играя вокруг вашего функционального требования со свежей новой библиотекой Tomahawk для JSF 2.0 и добавляя функциональность <f:ajax>, чтобы иметь возможность отключать/активировать необходимые компоненты с помощью аяксиальных мощностей, я, к сожалению, обнаружил ошибку в Tomahawk. Внутри <t:selectOneRadio>, неправильно отображает идентификатор клиента, а не один из <t:radio> в качестве аргумента для вызова ajax, который вызвал нарушение функции ajax. Я сообщил об этом как Tomahawk issue 1551.

Я не вижу других чистых решений для достижения этого сложного (по крайней мере, требования к компоненту JSF). Пока ребята из Tomahawk не исправят это, ваш лучший выбор представляет временное временное решение JS для исправления неверного аргумента для вызова ajax во время onload. Для справки только, вот, как форма будет выглядеть следующим образом:

<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 реализация не поддерживает гибкий компонент RadioButton подобное.

+0

Отличный материал, как обычно! Большое спасибо. Я не работал с myFaces, но дам ему завихрение. Еще раз спасибо! –

+1

Обратите внимание, что «MyFaces» на самом деле является другой реализацией JSF (конкурирует с Mojarra). У вас не должно быть необходимости заменять Mojarra MyFaces. Tomahawk - это расширенная библиотека компонентов, разработанная ребятами из MyFaces, но вы можете использовать ее как хорошую для Mojarra или любой другой реализации JSF. – BalusC

-1

Для начала, по-видимому, вы can't disable radios with css. Я бы

  • получить массив «процесс» дети радиоприемников
  • получить массив 'бренды детских входов
  • набор OnClick событий для процесса и бренды
  • для каждого OnClick события, отключить все объекты в одном массиве, разрешить все объекты в другом

Возможно, ... 20 строк кода, средний/наихудший случай.

+2

Это примерно так же просто, как вы описываете, используя прямой HTML/javascript. Это не так просто, используя JSF. –

Смежные вопросы