有问题的h:selectBooleanCheckbox位于h:dataTable(类别)中h:dataTable(Items)中的h:dataTable(Extras)中。显示许多项目,每个项目可以有许多额外项目。
<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>>
当我期望它将额外的id映射到值true时,有一个空的HashMap。
上面的代码或整个方法有什么不对?
非常感谢和问候。
答案 0 :(得分:3)
首先,您的h:dataTable
有三个级别。如果要将复选框附加到父托管bean属性,则需要考虑所有级别。所以,
<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
并将其绑定到该属性。