2011-10-11 38 views
1

我有以下下拉列表中的幾個汽車,我有它,以便它將選定項目的值存儲在一個backbean變量中,並且一個事件被觸發,所以其他下拉列表將根據所選內容填滿如低於此下拉控件的值:之前調用的事件函數安裝程序

<Td> 
<h:selectOneMenu id="combocarList" 
    value="#{customerBean.selectedcar}" 
    styleClass="comboStyle" 
    valueChangeListener="#{customerBean.loadothercombos}" 
    onchange="document.forms[0].submit()" 
    > 
    <f:selectItem 
     itemLabel="-----------Select--------------" 
     itemValue="None" /> 
    <f:selectItems value="#{customerBean.carsList}" /> 
</h:selectOneMenu> 
</Td> 

問題是,當從上面的下拉選擇了一個項目時,事件loadothercombos是引起問題的setter之前調用。

注意,backbean客戶定義爲:

<managed-bean-name>customerBean</managed-bean-name> 
    <managed-bean-class>com.theway.customer</managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 

行爲我在調試看到,當我從下拉式項目:

1) Getter is called for selectedcar 
2) Loadothercombos is called <------- This is called by the event 
3) Setter is called for selectedcar 

我不能讓它調用的setter在調用loadothercombos之前。任何洞察力將不勝感激。由於

回答

1

問題是,當從上面的下拉菜單中選擇了一個項目,該事件 loadothercombos二傳手

好之前調用,是預期的JSF生命週期的行爲。在提交的值成功轉換/驗證並且僅當提交的值與初始值不同時,纔會在驗證階段調用您的valueChangeListener="#{customerBean.loadothercombos}"。調用valueChangeListener後,JSF將與下一個UIInput的轉換/驗證,當JSF實現確定數據是否有效,然後繼續下一個Update Model Values Phase調用你的setter方法value="#{customerBean.selectedcar}"

7

使用valueChangeListener爲此,繼續一貫一個黑客的方式。基本上,有兩種方法可以解決這個「問題」:

  1. 呼叫FacesContext#renderResponse()使JSF將立即採取行動,呈現響應階段,因此更新模型值(和調用操作)階段將被跳過:

    public void loadothercombos(ValueChangeEvent event) { 
        selectedcar = (String) event.getNewValue(); 
        loadOtherCombosBasedOn(selectedcar); 
        // ... 
    
        FacesContext.getCurrentInstance().renderResponse(); 
    } 
    
  2. 隊列調用操作階段,使得它的工作被稱爲二傳手之後的事件:

    public void loadothercombos(ValueChangeEvent event) { 
        if (event.getPhaseId() == PhaseId.INVOKE_APPLICATION) { 
         loadOtherCombosBasedOn(selectedcar); 
        } else { 
         event.setPhaseId(PhaseId.INVOKE_APPLICATION); 
         event.queue(); 
        } 
    } 
    

如果您使用JSF 2.0,然後有一個更容易使用的<f:ajax>幫助來處理這樣說:

<h:selectOneMenu id="combocarList" 
    value="#{customerBean.selectedcar}" 
    styleClass="comboStyle"> 
    <f:selectItem 
     itemLabel="-----------Select--------------" 
     itemValue="None" /> 
    <f:selectItems value="#{customerBean.carsList}" /> 
    <f:ajax listener="#{customerBean.loadOtherCombos}" render="otherComboIds" /> 
</h:selectOneMenu> 

public void loadothercombos() { 
    loadOtherCombosBasedOn(selectedcar); 
} 

無關到具體問題:「組合框」是這個下拉元素的不正確的術語。組合框是可編輯下拉菜單,它基本上是<input type="text"><select>的組合。你在那裏只是呈現<select>而那些只是下拉,所以稱它們爲好。

相關問題