2012-11-26 61 views
1

我希望有人能幫助我。這是一個「類別 - 類型 - 項目」的情況,用戶必須從三個不同的下拉列表中進行選擇。在JSF中,我使用了三個h:selectoneMenu。前兩個h:selectOneMenu工作OK。我讀了一個解決方案here,當我第一次嘗試時發現有一個「malformedXML」錯誤。這就是每個selectOneMenu都被h:panelGorup包圍的原因。我實現了它並部分工作,並且只在重新加載(F5)頁面之後才工作,但這不是一個可接受的解決方案。如何製作三個互相依賴的JSF h:selectOneMenus

下面是我執行的代碼:

<p:panel rendered="#{temporadaControllerExt.noHayGrupos}" 
         style="width: 650px"> 

       <h:panelGrid columns="3"> 
         <h:panelGroup id="fases"> 
          <h:outputLabel value="Fase: "/> 
          <h:selectOneMenu value="#{temporadaControllerExt.faseSelectedFinal}"> 
           <f:selectItems value="#{temporadaControllerExt.fases}"/> 
           <f:ajax render="grupos"/> 
          </h:selectOneMenu> 
         </h:panelGroup> 

         <h:panelGroup id="grupos"> 
          <h:outputLabel value="Grupo: "/> 
          <h:selectOneMenu value="#{temporadaControllerExt.grupoSelected}" 
              disabled="#{temporadaControllerExt.grupoListDisable}"> 
           <f:selectItems value="#{temporadaControllerExt.gruposDefase}"/> 
           <f:ajax render="jornadas"/> 
          </h:selectOneMenu> 
         </h:panelGroup> 

         <h:panelGroup id="jornadas"> 
          <h:outputLabel value="Jornada: "/> 
          <h:selectOneMenu value="#{temporadaControllerExt.jornadaSelected}" 
              disabled="#{temporadaControllerExt.jornadaListDiseable}"> 
           <f:selectItems value="#{temporadaControllerExt.jornadasEnGrupo}"/> 
          </h:selectOneMenu> 
         </h:panelGroup> 

當然是不完整的,因爲空間原因。這裏是我使用的豆控制器的一部分:

@ManagedBean(name = "temporadaControllerExt") 
@SessionScoped 
public class TemporadaControllerExt extends TemporadaController { 

    private Fase fase; 
    private Grupo grupo; 
    private Jornada jornada; 

    private String faseSelectedFinal; 
    private String grupoSelected; 
    private String jornadaSelected; 
    private boolean grupoListDiseable = true; 
    private boolean jornadaListDiseable = true; 

    // a lot more declarations, and methods incluiding getters & setters not important for the answer... 

    //Entities Cache 
    private Map<String, Fase> mapFases = new HashMap<>(); 
    private Map<String, Grupo> mapGrupos = new HashMap<>(); 

    // use to enable the second selectOneMenu 
    public void setFaseSelectedFinal(String faseSelectedFinal) { 
     this.faseSelectedFinal = faseSelectedFinal; 
     this.grupoListDiseable = false; 
    } 

    public void setGrupoSelected(String grupoSelected) { 
     this.grupoSelected = grupoSelected; 
     this.jornadaListDiseable = false; 
    } 

    // methods used to populate the selecOneMenu's 
    public List<SelectItem> getFases(){ 
     List<SelectItem> fasesList = new ArrayList<>(); 
     fasesList.add(new SelectItem("-- Seleccione Fase --")); 
     for(Map.Entry<String, Fase> item : mapFases.entrySet()){ 
      fasesList.add(new SelectItem(item.getKey())); 
     } 
     return fasesList; 
    } 

    public List<SelectItem> getGruposDefase(){ 
     List<SelectItem> grupoList = new ArrayList<>(); 
     grupoList.add(new SelectItem("-- Seleccione Grupo --")); 

     Fase faseSel = mapFases.get(faseSelectedFinal); 
     List<Grupo> grupoInt = faseSel.getGrupoList(); 
     for(Grupo grp : grupoInt){ 
      grupoList.add(new SelectItem(grp.getNombre())); 
     } 

     return grupoList; 
    } 

    public List<SelectItem> getJornadasEnGrupo(){ 
     List<SelectItem> jornadaList = new ArrayList<>(); 
     jornadaList.add(new SelectItem("-- Seleccione Jornada --")); 

     Grupo grupoSel = mapGrupos.get(grupoSelected); 
     for(Jornada jor : grupoSel.getJornadaList()){ 
      jornadaList.add(new SelectItem(jor.getNumero().toString())); 
     } 
     return jornadaList; 
    } 
} 

正如你可以欣賞我使用primefaces(3.4),這個面板是按照以「noHayGrupos」的價值呈現布爾變量。這工作正常,我的問題是selectOneMenu鏈。

回答

2

在對我的問題進行了一些調查後,我找到了一個解決方案。我在this place中閱讀了一篇教程,該章是關於Marty Hall的「JSF 2.0集成Ajax支持」一節。解決方案很簡單:

聲明一個布爾變量來決定是否選擇了一個組合框,並詢問前一個組合框是否有一個數據有效的選擇,就是這樣,每件事情都有效。在這裏,我的方法getGruposDefase()使用的代碼:變量grupoListDisable用於控制進入第二個組合框

public List<SelectItem> getGruposDefase() { 
    List<SelectItem> grupoList = new ArrayList<>(); 
    grupoList.add(new SelectItem("-- Seleccione Grupo --")); 

    if (!grupoListDiseable && (faseSelectedFinal != null)) { 
     Fase faseSel = mapFases.get(faseSelectedFinal); 
     List<Grupo> grupoInt = faseSel.getGrupoList(); 
     for (Grupo grp : grupoInt) { 
      grupoList.add(new SelectItem(grp.getNombre())); 
     } 
    } 
    return grupoList; 
} 

,並faseSelectedFinal,說,如果你在第一個組合框選擇一個有效的項目。這個簡單的解決方案使代碼工作順利。謝謝馬蒂霍爾