Ajax 如何制作三个相互依赖的JSF h:SelectOne菜单
我希望有人能帮助我。这是一种类别类型的项目情况,用户必须从三个不同的下拉列表中进行选择。在JSF中,我使用了三个h:selectoneMenu。前两个h:选择一个功能表工作正常。我第一次尝试时读到了一个关于格式错误的DXML错误的解决方案。这就是为什么每个selectOneMenu都被一个h:panelGorup包围的原因。我实现了它,只在重新加载F5页面后才部分工作,但这不是一个可接受的解决方案 以下是我正在实现的代码:Ajax 如何制作三个相互依赖的JSF h:SelectOne菜单,ajax,jsf-2,primefaces,selectonemenu,chain,Ajax,Jsf 2,Primefaces,Selectonemenu,Chain,我希望有人能帮助我。这是一种类别类型的项目情况,用户必须从三个不同的下拉列表中进行选择。在JSF中,我使用了三个h:selectoneMenu。前两个h:选择一个功能表工作正常。我第一次尝试时读到了一个关于格式错误的DXML错误的解决方案。这就是为什么每个selectOneMenu都被一个h:panelGorup包围的原因。我实现了它,只在重新加载F5页面后才部分工作,但这不是一个可接受的解决方案 以下是我正在实现的代码: <p:panel rendered="#{temporadaCon
<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布尔变量的值呈现的。这工作正常,我的问题是SelectOne菜单链。在对我的问题进行一些调查后,我找到了一个解决方案。我在中阅读了一篇教程,这是Marty Hall关于JSF 2.0中集成Ajax支持的部分。解决方案非常简单: 声明一个布尔变量以确定是否选择了一个组合框,并询问前一个组合框是否选择了一个有效的数据,就是这样,每件事都有效。下面是我在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用于控制对第二个组合框的访问,如果您在第一个组合框中选择了有效项,则为faseSelectedFinal。这个简单的解决方案使代码工作顺利。谢谢Marty Hall