/ / Wie kann ich den Wert eines h: selectBooleanCheckbox in einer h: dataTable innerhalb einer h: dataTable zuordnen? - jsf, datatable, Hashmap

Wie man den Wert einer h: selectBooleanCheckbox in einer h: dataTable innerhalb einer h: dataTable abbildet? - jsf, datable, hashmap

Die betreffende h: selectBooleanCheckbox steht in einem h:dataTable (von Extras) innerhalb einer h: dataTable (von Artikeln) innerhalb einer h: dataTable (von Kategorien) Viele Artikel werden angezeigt und jeder Artikel kann viele Extras enthalten.

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

Nachdem die Seite gerendert wurde, wähle ich ein Kontrollkästchen und dann "Hinzufügen". Innen bean.add mein

Map<Integer, HashMap<Integer, Boolean>>

hat eine leere HashMap, wenn ich davon ausgehe, dass die ID des Zusatzes dem Wert true zugeordnet ist

Was stimmt nicht mit dem obigen Code oder der gesamten Vorgehensweise?

Vielen Dank und Grüße.

Antworten:

3 für die Antwort № 1

Zuerst dein h:dataTable ist drei Ebenen tief. Wenn Sie das Kontrollkästchen an eine übergeordnete verwaltete Bean-Eigenschaft anhängen möchten, müssen Sie alle Ebenen berücksichtigen. So,

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

mit einem Map<Integer, Map<Integer, Map<Integer, Boolean>>> als Eigentum. Andernfalls werden die Auswahlen für jede Kategorie überschrieben, bis die ausgewählten Elemente der letzten Kategorie in der Karte angezeigt werden.

Zweitens müssen Sie auch die Karte und alle verschachtelten Karten vorab erstellen. JSF macht das nicht für Sie. Mit anderen Worten:

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

Alternativ können Sie auch in Betracht ziehen, eine Boolean Eigentum zu Extra und binden Sie stattdessen daran.