1

<t:dataTable>2 つの列に 2つのドロップダウンがあり<h:selectOneMenu>ます。2 番目のドロップダウンは、最初のドロップダウンの値に応じて入力されます。

<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>と、2 番目のドロップダウンの が入力されます。問題は、両方<h:selectOneMenu>の がデータベースから事前に初期化された値を表示する必要がある場合に発生します。私が書いたように、最初のドロップダウンで値を手動で選択しない限り、2 番目のドロップダウンには対応する値がロードされません。すると、期待値が表示されます。

私は次のようなことを試しました: javascript onload event から managebean メソッドを実行しますが、機能させることができません。これどうやってするの?

4

1 に答える 1

1

最後の列の2番目のドロップダウンのリストが1つの同じBeanプロパティにバインドされており、現在の行にまったく依存していないため、具体的な問題が発生します。

このコンストラクトでは、1 番目のドロップダウンで現在選択されている値を 2 番目のドロップダウンに渡すのが最善の策<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>

(最初のドロップダウンから を削除し、2 番目のドロップダウン<f:ajax listener>の を変更しました<f:selectItems value>)

そして、元の ajax リスナー メソッドのジョブを getter behind に移動し<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;
}

ここでは遅延読み込み + キャッシュが実装されていることに注意してください。また、クラスのequals()とが適切に実装されていることを確認する必要があることに注意してください。hashCode()Tabla

于 2012-10-31T12:43:39.493 に答える