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 № 1Zuerst 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.