Как отобразить значение ah: selectBooleanCheckbox в ah: dataTable внутри ah: dataTable? - PullRequest
1 голос
/ 28 августа 2010

Рассматриваемый h: selectBooleanCheckbox находится в h: dataTable (из Extras) внутри h: dataTable (из Items) в h: dataTable (из Categories). Отображается много предметов, и у каждого предмета может быть много дополнений.

<h:dataTable value="#{bean.categoryList}" var="category">
    <h:column>
        <h:dataTable value="#{category.itemList}" var="item">
            <h:column>
                <h:dataTable value="#{item.extraList}" var="extra">
                    <h:column>
                        <!-- The h:selectBooleanCheckbox in question //-->
                        <h:selectBooleanCheckbox value="#{bean.extraSelectedMap[item.id][extra.id]}"/>
                    </h:column>
                    <h:commandLink action="#{bean.add}" value="Add">
                </h:dataTable>
            </h:column>
        </h:dataTable>
    </h:column>
</h:dataTable>

После отображения страницы я устанавливаю флажок, затем выбираю «Добавить». Внутри bean.add мой

Map<Integer, HashMap<Integer, Boolean>>

имеет пустой HashMap, когда я ожидаю, что в нем будет добавлен id дополнительного значения true.

Что не так с кодом или всем подходом выше?

Большое спасибо и всего наилучшего.

1 Ответ

3 голосов
/ 28 августа 2010

Во-первых, ваш h:dataTable имеет три уровня глубины.Если вы хотите прикрепить флажок к свойству родительского управляемого компонента, вам необходимо принять во внимание все уровни.Итак,

<h:selectBooleanCheckbox value="#{bean.extraSelectedMap[category.id][item.id][extra.id]}"/>

с Map<Integer, Map<Integer, Map<Integer, Boolean>>> в качестве свойства.В противном случае выбор будет переопределен для каждой категории, пока выбранные элементы последней категории не окажутся на карте.

Во-вторых, вам необходимо предварительно создать карту и все вложенные карты.JSF не сделает это для вас.Другими словами,

public Bean() {
    extraSelectedMap = new HashMap<Integer, Map<Integer, Map<Integer, Boolean>>>();
    for (Category category : categoryList) {
        Map<Integer, Map<Integer, Boolean>> selectedExtrasPerCategory = new HashMap<Integer, Map<Integer, Boolean>>();
        extraSelectedMap.put(category.getId(), selectedExtrasPerCategory);
        for (Item item : category.getItemList()) {
            Map<Integer, Boolean> selectedExtrasPerItem = new HashMap<Integer, Boolean>();
            selectedExtrasPerCategory.put(item.getId(), selectedExtrasPerItem);
        }
    }

В качестве альтернативы, вы можете также просто добавить свойство Boolean в Extra и связать его с ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...