2010-05-19 31 views
1

在我看來,我有兩個菜單,我想依賴,即,如果第一個菜單保存值「呈現第二個菜單」和「不呈現第二個菜單」,我想第二個菜單隻有當用戶選擇「渲染第二個菜單「選項。第二個菜單在與第一個菜單相同的頁面上呈現後,用戶必須從中選擇當前項目,填充另一個字段並提交表單以將值存儲在數據庫中。兩個選項列表都是靜態的,它們從數據庫中獲取一次並保持不變。我的問題是我總是從第二個菜單中選擇的項目的值爲null。如何獲得適當的價值?保存有問題的元件的視圖的示例代碼:JSF:如果selectOneMenu的渲染是動態的,如何從selectOneMenu中獲取所選項目?

<h:selectOneMenu id="renderSecond" value="#{Bean.renderSecondValue}" 
           valueChangeListener="#{Bean.updateDependentMenus}" 
           immediate="true" 
           onchange="this.form.submit();" > 
        <f:selectItems value="#{Bean.typesOfRendering}" /> 
       </h:selectOneMenu><br /> 

<h:selectOneMenu id="iWillReturnYouZeroAnyway" value="#{Bean.currentItem}" 
           rendered="#{Bean.rendered}" > 
        <f:selectItems value="#{Bean.items}" /> 
       </h:selectOneMenu><br /> 
<h:commandButton action="#{Bean.store}" value="#Store" /> 

但是,如果我從第二個菜單中刪除「渲染」屬性,一切工作正常,除了用於顯示菜單的一切,我試圖阻止時間,所以我建議問題是動態渲染的行爲。 isRendered的初始值爲false,因爲第一個菜單中的默認項目是「不渲染第二個菜單」。當我更改第一個菜單中的值並使用valueChangeListener更新isRendered時,會顯示第二個菜單,但在提交時不會初始化currentItem。

從我的支持bean部分代碼如下:只有

public void updateDependentMenus(ValueChangeEvent value) { 
    String newValue = (String) value.getNewValue(); 
     if ("render second menu" == newValue){ 
      isRendered = true; 
     } else { 
      isRendered = false; 
     } 
} 

public String store(){ 
    System.out.println(currentItem); 
    return "stored"; 
} 

回答

3

如果您在使用上UIInputUICommand組件rendered屬性,那麼你必須確保該rendered條件計算正好在隨後請求同樣的方式,因爲它是在初始請求期間(提交表單時) (在顯示錶單的過程中)。如果評估結果爲假,那麼請求值將不會被應用/驗證,模型值將不會更新,也不會針對相關組件調用任何操作。

一個簡單的解決方法是將bean放入會話範圍,但這也有一些警告(當在多個瀏覽器選項卡/窗口中打開相同頁面時,用戶體驗不佳)。在JSF 2.0上,您可以使用視圖範圍。在JSF 1.x上,您可以使用Tomahawk的t:saveState

+0

是的,那正是我也在想的。但是,並不知道視圖範圍。謝謝。 – 2010-05-19 18:21:04

0

問題出現時,我們有「不渲染」作爲第一選擇。我決定改變數據庫中的值,現在我有第一個「渲染第二個菜單」。採用這種方法,一切正常。

相關問題