2010-10-13 58 views
1

我需要從端口PHP應用程序JSF 2.一切是除了相當複雜的單選按鈕組細:JSF複雜級聯單選按鈕

alt text

當「過程中的應用爲:」被選擇,子單選按鈕組被啓用。其中,當選擇「其他」時,相應的文本框被啓用。當選擇'品牌'時,這兩個文本框被啓用。當然,取消選擇任何這些都會禁用相應的標籤。

我想不出有什麼辦法可以做到這一點,超越了3個獨立的<h:selectOneRadioButton />標籤,有大量的JavaScript處理禁用/啓用標籤,以及更多的JavaScript處理選擇/取消選擇不同的單選按鈕,以便它們出現成爲一組單選按鈕。任何人都能想到比這更好的解決方案嗎?像自定義的<h:selectItem />

感謝

回答

3

您最好打賭是Tomahawk's<t:selectOneRadio>layout屬性設置爲spread。這還有一個好處,就是你可以用你想要的方式使用<t:radio>,而不是標準的<h:selectOneRadio>,它只支持layout屬性pageDirectionlineDirection,並且呈現一個表格,這樣你就可以按照你想要的方式使用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實現不支持這樣的一個靈活的單選按鈕組件。

+0

像往常一樣好東西!非常感謝。我沒有與myFaces合作過,但會給它一個旋風。再次感謝! – 2010-10-14 11:28:01

+1

請注意,「MyFaces」實際上是另一個JSF實現(與Mojarra競爭)。你不應該有需要用MyFaces取代Mojarra。 Tomahawk是由MyFaces開發的擴展組件庫,但您可以在Mojarra或任何其他JSF實現上使用它。 – BalusC 2010-10-14 11:32:43

-1

對於初學者來說,顯然你can't disable radios with css。我會

  • 得到的「過程」孩子的無線電的陣列
  • 得到的「品牌」孩子一個輸入數組
  • 設置過程的onclick事件和品牌
  • 每個onclick事件,禁用所有對象在一個陣列中,啓用其他所有對象

可能... 20行代碼,中/最壞情況。

+2

這與您使用直線HTML/javascript描述的一樣簡單。使用JSF並不那麼簡單。 – 2010-10-14 01:04:01