如何根据数据表中另一个下拉列表的值填充下拉列表?

时间:2012-10-31 10:46:27

标签: jsf jsf-2

我有一个<t:dataTable>,在两列中有两个<h:selectOneMenu>下拉列表。根据第一个下拉列表的值填充第二个下拉列表。

<t:dataTable value="#{tablaConfigBean.tablaConfigList}" var="item">
    <t:column>
        <h:selectOneMenu value="#{item.tabla}">
            <f:selectItem itemLabel="SIN CORRESPONDENCIA" itemValue="SIN CORRESPONDENCIA"/> 
            <f:selectItems value="#{tablaConfigBean.tablasList}" var="tabla" itemLabel="#{tabla}"  itemValue="#{tabla}"/>
            <f:ajax listener="#{tablaConfigBean.rellenaCampos}" render="seleccionCampoCorrespondido"/>
        </h:selectOneMenu>
    </t:column>
    <t:column>
        <h:selectOneMenu id="seleccionCampoCorrespondido" value="#{item.columnaCorr}">
            <f:selectItems id="listaCampoCorrespondido" value="#{tablaConfigBean.camposList}" var="campo" itemValue="#{campo}"/>
        </h:selectOneMenu>
    </t:column>
</t:dataTable>

豆:

public void rellenaCampos (AjaxBehaviorEvent event) throws Exception {
    dataTable = (HtmlDataTable) event.getComponent().getParent().getParent();
    fila = (cCNtablaConfig) dataTable.getRowData();
    tablaParaCampos = fila.getTabla();      
    camposList = cDAOtablaConfig.rellenaCamposTabla(idSistema, sistema.desEsquema, tablaParaCampos, 3);
}

虽然第一个下拉列表没有任何值,但默认情况下始终会加载<f:selectItems>。如果我选择其中一个值,则填充第二个下拉列表的<f:selectItems>。当两个<h:selectOneMenu>必须显示从数据库中预初始化的值时,会出现问题。正如我所写,第二个下拉列表没有加载相应的值,除非我手动选择第一个下拉列表中的值。然后,出现预期值。

我尝试过这样的事情:Execute managebean method from javascript onload event,但我无法让它发挥作用。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

导致您的具体问题是因为最后一列中第二个下拉列表的列表已绑定到一个且相同的 bean属性,并且不依赖于当前行。

在此构造中,您最好的选择是将第一个下拉列表的当前选定值传递给第二个下拉列表的<f:selectItems>

<t:dataTable value="#{tablaConfigBean.tablaConfigList}" var="item">
    <t:column>
        <h:selectOneMenu value="#{item.tabla}">
            <f:selectItem itemLabel="SIN CORRESPONDENCIA" itemValue="SIN CORRESPONDENCIA"/> 
            <f:selectItems value="#{tablaConfigBean.tablasList}" var="tabla" itemLabel="#{tabla}"  itemValue="#{tabla}"/>
            <f:ajax render="seleccionCampoCorrespondido"/>
        </h:selectOneMenu>
    </t:column>
    <t:column>
        <h:selectOneMenu id="seleccionCampoCorrespondido" value="#{item.columnaCorr}">
            <f:selectItems id="listaCampoCorrespondido" value="#{tablaConfigBean.getCamposList(item.tabla)}" var="campo" itemValue="#{campo}"/>
        </h:selectOneMenu>
    </t:column>
</t:dataTable>

(我从第一个下拉列表中删除了<f:ajax listener>,然后我更改了第二个下拉菜单的<f:selectItems value>

将原始的ajax侦听器方法的作业移动到<f:selectItems>后面的getter。

private Map<Tabla, List<Campo>> tablaCampos = new HashMap<Tabla, List<Campo>>();

public List<Campo> getCamposList(Tabla tablaParaCampos) {
    List<Campo> campos = tableCampos.get(tablaParaCampos);

    if (campos == null) {
        campos = cDAOtablaConfig.rellenaCamposTabla(idSistema, sistema.desEsquema, tablaParaCampos, 3);
        tableCampos.put(table, campos);
    }

    return campos;
}

请注意,这里实现了延迟加载+缓存。另请注意,您应确保equals()类的hashCode()Tabla已正确实施。