2010-06-03 36 views
4

任何人都可以告訴我如何自動設置<h:selectOneMenu>(或任何其他組件)的值取決於另一個<h:selectOneMenu>如果存在具有'required'的空元素設置爲表單上的'真'?如果要設置<a4j:support event="onchange" reRender="anotherElement" immediate="true" />則不會更改,因爲未更改值。但是,如果沒有immediate="true",我總是有消息說這個或那個元素不能爲空。這裏的代碼示例不起作用。如果兩個都設置爲需要,如何設置下拉值,具體取決於另一個下拉菜單

<h:outputLabel value="* #{msg.someField}: "/> 
<h:panelGrid cellpadding="0" cellspacing="0"> 
    <h:selectOneMenu id="someSelect" 
      value="#{MyBean.someObj.someId}" 
      required="true" label="#{msg.someField}" 
      > 
     <a4j:support event="onchange" reRender="anotherSelect" limitToList="true" immediate="true"/> 
     <f:selectItem itemValue=""/> 
     <f:selectItems value="#{MyBean.someList}"/> 
    </h:selectOneMenu> 
    <rich:message for="someSelect" styleClass="redOne"/> 
</h:panelGrid> 

<h:outputLabel value="* #{msg.anotherField}: "/> 
<h:panelGrid cellpadding="0" cellspacing="0"> 
    <h:selectOneMenu id="anotherSelect" 
      value="#{MyBean.someObj.anotherId}" 
      required="true" label="#{msg.anotherField}" 
      > 
     <f:selectItem itemValue=""/> 
     <f:selectItems value="#{MyBean.anotherList}"/> 
    </h:selectOneMenu> 
    <rich:message for="anotherSelect" styleClass="redOne"/> 
</h:panelGrid> 

<h:outputLabel value="* #{msg.name}: "/> 
<h:panelGrid cellpadding="0" cellspacing="0"> 
    <h:inputText id="myName" value="#{MyBean.someObj.myName}" 
      required="true" label="#{msg.name}"/> 
    <rich:message for="myName" styleClass="redOne"/> 
</h:panelGrid> 

所以,在這裏(我重複),如果我試圖改變「someSelect」然後「anotherSelect」應該更新自己的價值觀,但它不會因爲任何時候,它會得到「someSelect」它得到的值空(如果immediate設置爲true)或表單驗證在空元素上失敗。我如何跳過驗證,但從「someSelect」中獲取此更改的值?

回答

2

您是否嘗試將ajaxSingle="true"添加到someSelect a4j:support元素?取下immediate="true"

+0

是的,謝謝! 很簡單:) – mykola 2010-06-04 07:00:25

0

以下解決方案在JSF 2.0

<h:outputLabel 
    value="* Country: "/> 
<h:selectOneMenu 
    id="someSelect" 
    value="#{testController.countryName}" 
    required="true"> 
    <f:selectItem 
     itemLabel="Select Country" 
     itemValue=""/> 
    <f:selectItems 
     value="#{testController.countryNamesSelectItems}"/> 
    <!-- This will only update "someSelect" and repaint "anotherSelect" --> 
    <f:ajax 
     execute="@this" 
     render="anotherSelect"/> 
</h:selectOneMenu> 

<h:outputLabel 
    value="* State: "/> 
<h:selectOneMenu 
    id="anotherSelect" 
    value="#{testController.stateName}" 
    required="true"> 
    <f:selectItem 
     itemLabel="Select State" 
     itemValue=""/> 
    <f:selectItems 
     value="#{testController.stateNamesSelectItems}"/> 
</h:selectOneMenu> 

殲作品:Ajax調用將提交一個Ajax請求到服務器的onchange 「someSelect」 的。只有「someSelect」組件的模型更新會發生(因爲execute =「@ this」)。在渲染響應階段,只有「anotherSelect」將被重新渲染(因此使用更新的國家名稱調用testController.stateNamesSelectItems)。

作爲所有這些的結果,所選國家的狀態將更新爲當國家改變時... ajax方式。

希望這會有所幫助。

+0

謝謝,但我使用jsf 1.2。 :) – mykola 2010-06-04 07:00:53

相關問題