1

我在两列中<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>s 必须显示从数据库预初始化的值时,就会出现问题。正如我所写的,除非我手动选择第一个下拉列表中的值,否则第二个下拉列表不会加载相应的值。然后,出现预期值。

我尝试过这样的事情:Execute managebean method from javascript onload event,但我无法使其工作。我怎样才能做到这一点?

4

1 回答 1

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 listener 方法的工作移到后面的 getter 中<f:selectItems>

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

Note that lazy loading + cache is implemented here. Also note that you should make sure that the equals() and hashCode() of Tabla class are properly implemented.

于 2012-10-31T12:43:39.493 回答