0

我有以下失败的 facelet 代码:

<h:form>
    <rich:select defaultLabel="Seleccionar región">
        <f:selectItems value="#{StaticInfo.regiones}" var="region" itemValue="#{region.reg_Cod}" itemLabel="#{region.reg_Nombre}" />
        <a4j:ajax event="change" render="provs" />
    </rich:select>
    <rich:select id="provs" defaultLabel="Seleccionar provincia">
    <f:selectItems value="#{region.provincias}" var="prov" itemValue="#{prov.prov_Cod}" itemLabel="#{prov.prov_Nombre}" />
    </rich:select>
</h:form>

支持豆:

public class StaticInfoBean {

    private ArrayList<Region> regiones;

    public StaticInfoBean() {
        try
        {
            RegionDAO regDao = new RegionDAO();
            regDao.prepareConnection();
            ProvinciaDAO provDao = new ProvinciaDAO();
            provDao.setCon(regDao.getCon());
            ComunaDAO comDao = new ComunaDAO();
            comDao.setCon(regDao.getCon());
            regiones = regDao.listaRegiones();
            for(Region r : regiones)
            {
                regDao.findProvincias(r);
                for(Provincia p : r.getProvincias())
                {
                    provDao.findComunas(p);
                    for(Comuna c : p.getComunas())
                    {
                        comDao.findColegios(c);
                    }
                }
            }
            regDao.getCon().close();
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
    }

    public ArrayList<Region> getRegiones() {
        return regiones;
    }

    public void setRegiones(ArrayList<Region> regiones) {
        this.regiones = regiones;
    }

    public String toString() {
        return regiones.toString();
    }

}

Region

public class Region {

    private String Reg_Cod;
    private String Reg_Nombre;
    private ArrayList<Provincia> provincias;
//Getters and setters

问题:第一个rich:select标签工作得很好。但是第二个不显示任何值。不仅如此,我还在 NetBeans 中工作,Provincia每当我在 EL 中键入“prov”时,它都不会显示类的方法列表。

任何帮助表示赞赏。

编辑:我编辑了我的代码并执行了以下操作:

<h:form>
    <rich:select defaultLabel="Seleccionar región" value="#{StaticInfo.regionElegida}">
        <f:selectItems value="#{StaticInfo.regiones}" var="region" itemValue="#{region.reg_Cod}" itemLabel="#{region.reg_Nombre}" />
        <a4j:ajax event="click" render="provs" execute="@this" />
        <a4j:ajax event="click" render="texto" execute="@this" />
    </rich:select>
<h:outputText id="texto" value="#{StaticInfo.regionElegida.reg_Nombre}" />
    <rich:select id="provs" defaultLabel="Seleccionar provincia" value="#{StaticInfo.provinciaElegida}" rendered="#{not empty StaticInfo.regionElegida}">
        <f:selectItems value="#{StaticInfo.regionElegida.provincias}" var="prov" itemValue="#{prov.prov_Cod}" itemLabel="#{prov.prov_Nombre}" />
    </rich:select>
</h:form>

令人惊讶的是 outputText 没有显示出来!为什么会发生这种情况?

4

1 回答 1

2

region设置的变量f:selectItems仅在其范围内可用。您必须将每个绑定rich:select到一个支持 bean 属性。

因此,您需要更改 bean 代码,将所选区域的属性添加到 bean:

public class StaticInfoBean {    
    private ArrayList<Region> regiones;
    private Region regionElegida;
    private Provincia provinciaElegida; // <-- you'll probably want this too...

    // ... getters and setters and your initialization code

    // and you need something to find the real region object that
    // used the reg_Cod value got from rich:select, for now you can try this:
    public void updateRegionElegida(AjaxBehaviorEvent e){
        // set the chosen region to regionElegida,
        // or the poor man's converter
        for (Region region : regiones){
            if(regionElegida.getReg_Cod() == region.getReg_cod()) {
                regionElegida = region;
            }
        }
    }
}

然后将您的 XHTML 更改为以下内容:

<h:form>
    <rich:select value="#{StaticInfo.regionElegida}"
          defaultLabel="Seleccionar región">
        <f:selectItems value="#{StaticInfo.regiones}" var="region"
             itemValue="#{region.reg_Cod}" itemLabel="#{region.reg_Nombre}" />
        <a4j:ajax event="change" render="provs"
             listener="#{StaticInfo.updateRegionElegida}" />
    </rich:select>
    <rich:select id="provs" value="#{StaticInfo.provinciaElegida}"
          defaultLabel="Seleccionar provincia">
        <f:selectItems value="#{StaticInfo.regionElegida.provincias}" var="prov"
            itemValue="#{prov.prov_Cod}" itemLabel="#{prov.prov_Nombre}" />
    </rich:select>
</h:form>

现在,进行这种转换的专业方法是使用自定义转换器,该转换器可以根据itemValue用于其选择小部件的表达式的值找到 Region 对象的适当实例。从另一个问题中查看此示例。

请注意,rich:select仅将功能添加到 default h:selectOneMenu,您最好在 SO上查看其信息页面。

于 2012-07-31T17:29:37.650 回答