我需要将应用程序从PHP移植到JSF 2.除了相当复杂的单选按钮组外,一切都很好:
选择'Process Application for:'时,启用子单选按钮组。在其中,当选择“其他”时,将启用相应的文本框。选择“品牌”时,会启用这两个文本框。当然,取消选择其中任何一个都会再次禁用相应的标签。
除了3个独立的<h:selectOneRadioButton />
标签之外,我无法想到任何方法,大量的javascript处理禁用/启用标签,以及更多javascript处理选择/取消选择不同的单选按钮所以它们看起来像是一组单选按钮。谁能想到比这更好的解决方案?像自定义<h:selectItem />
这样的东西?
由于
答案 0 :(得分:3)
最好的选择是Tomahawk's <t:selectOneRadio>
,layout
属性设置为spread
。这样做的另一个好处是,您可以使用<t:radio>
按照您希望的方式在HTML标记中放置单个单选按钮,而不是仅支持<h:selectOneRadio>
的标准layout
属性pageDirection
和lineDirection
并呈现表格。
然而,在使用全新的新版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。我会
可能...... 20行代码,中/最坏情况。