JSF复杂级联单选按钮

时间:2010-10-13 23:09:44

标签: javascript html jsf radio-button jsf-2

我需要将应用程序从PHP移植到JSF 2.除了相当复杂的单选按钮组外,一切都很好:

alt text

选择'Process Application for:'时,启用子单选按钮组。在其中,当选择“其他”时,将启用相应的文本框。选择“品牌”时,会启用这两个文本框。当然,取消选择其中任何一个都会再次禁用相应的标签。

除了3个独立的<h:selectOneRadioButton />标签之外,我无法想到任何方法,大量的javascript处理禁用/启用标签,以及更多javascript处理选择/取消选择不同的单选按钮所以它们看起来像是一组单选按钮。谁能想到比这更好的解决方案?像自定义<h:selectItem />这样的东西?

由于

2 个答案:

答案 0 :(得分:3)

最好的选择是Tomahawk's <t:selectOneRadio>layout属性设置为spread。这样做的另一个好处是,您可以使用<t:radio>按照您希望的方式在HTML标记中放置单个单选按钮,而不是仅支持<h:selectOneRadio>的标准layout属性pageDirectionlineDirection并呈现表格。

然而,在使用全新的新版Tomahawk JSF 2.0库并添加<f:ajax>功能以利用ajaxical权限禁用/启用必要组件时,我可以解决您的功能需求,但遗憾的是我遇到了一个错误。钺。在<t:selectOneRadio>内,<f:ajax>错误地呈现其客户端ID而不是<t:radio>作为ajax调用的参数,导致ajax函数崩溃。我已将其报告为Tomahawk issue 1551

我没有看到其他干净的解决方案来实现这种复杂性(至少在JSF组件术语中)要求。在Tomahawk家伙得到修复之前,最好的办法是引入一个基于JS的临时解决方法来修复onload期间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实现不支持这样的灵活的radiobutton组件。

答案 1 :(得分:-1)

首先,显然是你can't disable radios with css。我会

  • 获取一系列'进程'儿童无线电
  • 获得一系列'品牌'儿童输入
  • 为流程和品牌设置onclick事件
  • 对于每个onclick事件,禁用一个数组中的所有对象,启用另一个
  • 中的所有对象

可能...... 20行代码,中/最坏情况。