1

c:forEach ループで複数の h:selectOneMenu コンポーネントの値を記憶したい。h:selectOneMenu の最後の値のみが記憶されるようになりました。h:selectOneMenu がいくつ表示されるかはわかりません。

<h:panelGrid 
                    id="wynik"
                    columns="2"
                    border="0" 
                    cellpadding="2" 
                    cellspacing="0" 
                    rowClasses="jsfcrud_odd_row,jsfcrud_even_row" 
                    rules="all" 
                    style="border:solid 1px">
                    <h:outputText id="ns" value="Numer stanowiska"/>
                    <h:outputText id="kontr" value="Kontroler"/>
                    <c:forEach 
                        var="stanowisko"
                        begin="1" 
                        end="#{stojakiController.selected.iloscstanowisk}"
                        step="1">
                        <h:column>
                            <h:outputText value="#{stanowisko}"/>
                        </h:column>
                        <h:column>
                            <h:selectOneMenu 
                                id="kontroler_#{stanowisko}" 
                                value="#{wyposazenieStojakaController.selected.kontroler}" 
                                title="#{bundle.CreateWyposazenieStojakaTitle_kontroler}" 
                                required="true" 
                                requiredMessage="#{bundle.CreateWyposazenieStojakaRequiredMessage_kontroler}">
                                <f:selectItems value="#{kontroleryController.itemsAvailableSelectOne}"/>
                            </h:selectOneMenu>
                        </h:column>
                    </c:forEach>
                </h:panelGrid>
4

1 に答える 1

4

これは、動的にサイズ変更されるコレクションに基づいてテーブルをレンダリングする正しい方法ではありません。各行の値を1 つの同じバッキング Bean プロパティにバインドしています。このプロパティは、各行に値を設定する必要があるたびに上書きされます。そのため、最終行の値のみが得られます。

<h:dataTable>ではなく、代わりに使用する必要があり<h:panelGrid>ます<c:forEach>。オブジェクトのサイズだけでなく、具体的なモデル オブジェクトのコレクションを準備する必要があります。例えば、

public class Item {

    private String value;

    // ...
}

次に、バッキング Bean の (ポスト) コンストラクターで、必要な数だけ準備する必要があります。

public class Bean {

    private List<Item> items;

    @PostConstruct
    public void init() {
        items = new ArrayList<Item>();

        for (int i = 0; i < yourDesiredAmountOfItems; i++) {
            items.add(new Item());
        }
    }

    // ...
}

そして、これをどのように使用すべきかの基本的なキックオフの例を次に示します。

<h:dataTable value="#{bean.items}" var="item">
    <h:column>
        <h:selectOneMenu value="#{item.value}">
            <f:selectItems value="#{bean.availableValues}" />
        </h:selectOneMenu>
    </h:column>
</h:dataTable>

フォームを送信すると、JSF は、行に関連付けられた個別のアイテム オブジェクトごとに、各行の値を適切に設定します。

于 2012-06-11T00:22:04.020 に答える