您最好打賭是Tomahawk's<t:selectOneRadio>
與layout
屬性設置爲spread
。這還有一個好處,就是你可以用你想要的方式使用<t:radio>
,而不是標準的<h:selectOneRadio>
,它只支持layout
屬性pageDirection
和lineDirection
,並且呈現一個表格,這樣你就可以按照你想要的方式使用HTML標記定位單個單選按鈕。然而,當用新的Tomahawk庫爲JSF 2.0增加功能並添加<f:ajax>
功能以便能夠在ajaxical權力的幫助下禁用/啓用必要組件時,我不幸遇到了Tomahawk中的一個錯誤。在<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實現不支持這樣的一個靈活的單選按鈕組件。
像往常一樣好東西!非常感謝。我沒有與myFaces合作過,但會給它一個旋風。再次感謝! – 2010-10-14 11:28:01
請注意,「MyFaces」實際上是另一個JSF實現(與Mojarra競爭)。你不應該有需要用MyFaces取代Mojarra。 Tomahawk是由MyFaces開發的擴展組件庫,但您可以在Mojarra或任何其他JSF實現上使用它。 – BalusC 2010-10-14 11:32:43