1

誰かが私を助けてくれることを願っています。これは、ユーザーが 3 つの異なるドロップダウン リストから選択する必要がある "Category-Type-Item" 状況です。JSF では three で作成しましたh:selectoneMenu。最初の 2 つh:selectOneMenuは問題なく動作します。初めて試したときの「malformedXML」エラーについて、こちらの解決策を読みました。これが、各 selectOneMenu が で囲まれている理由h:panelGorupです。私はそれを実装し、ページをリロード (F5) した後にのみ部分的に機能しますが、これは受け入れられる解決策ではありません。

私が実装しているコードは次のとおりです。

<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>

もちろん、スペースの都合上、完全ではありません。そして、これが私が使用しているBeanコントローラーの一部です:

@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 チェーンです。

4

1 に答える 1

2

私の問題について調査した後、私は解決策を見つけました。この場所で、MartyHallによる「JSF2.0での統合Ajaxサポート」に関連するセクションのチュートリアルを読みました。解決策は非常に簡単でした:

ブール変数を宣言して、comboBoxが選択されているかどうかを判別し、前のコンボボックスで有効なデータが選択されているかどうかを確認します。これですべてが機能しました。getGruposDefase()メソッドで使用するコードは次のとおりです。

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;
}

変数grupoListDisableは、2番目のcomboBoxへのアクセスを制御するために使用され、faseSelectedFinalは、最初のcomboBoxで有効な項目を選択したかどうかを示します。この単純なソリューションにより、コードがスムーズに機能します。ありがとうマーティホール

于 2012-12-01T16:52:58.240 に答える