我有:一个包含属性的实体在方向x(例如:大,小…)和实体本身在y方向的数据表。当创建实体时,用户确定属性,当我查看数据表时,booleanCheckbox应该表示实体是否包含属性。然而,我希望能够改变这个数据表的属性。
编辑:实体(产品)可以有多个类别,类别可以有多个产品。
问题:
<p:selectBooleanCheckbox value="#{product.hasCategory(cat)}">
<p:ajax event="change" listener="# {productController.remove(product, cat)}" update="propTabView:propForm:propTable"/>
</p:selectBooleanCheckbox>
这不起作用,因为复选框只需要一个布尔值value="#{product.hasProperty}
结果是javax.el.PropertyNotWritableException: Illegal Syntax for Set Operation
我尝试了什么:显示一个布尔值,因为它是由primefaces要求的,但它的状态被侦听器改变。
<p:selectBooleanCheckbox value="#{productController.hasProperty}">
<p:ajax event="???" listener="#{productController.change(product, cat)}"/>
</p:selectBooleanCheckbox>
问题:我需要在加载数据表时初始化布尔值。
问题1:是否有一种方法可以在加载数据表时初始化复选框的状态,取决于X和Y方向的实体?
Question2:我如何显示一个2D SelectBooleanCheckBox,其中复选框的状态是从实体和属性的状态派生的?
谢谢
解决了!
因为我有两个实体(产品和类别),我使用Map<Category, Map<Product, Boolean>>
数据表:
<p:dataTable id="propTable"
value="#{productController.allProducts}"
var="product"
resizableColumns="true"
reflow="true"
tableStyle="width: auto">
<p:column headerText="Artikel">
<p:outputLabel value="#{product.name}"/>
</p:column>
<p:columns value="#{categoryController.categories}" var="cat">
<f:facet name="header">
<h:outputText value="#{cat.name}" />
</f:facet>
<p:selectBooleanCheckbox value="#{categoryController.map[cat][product]}">
<p:ajax event="change" listener="#{productController.update(product, cat)}"/>
</p:selectBooleanCheckbox>
</p:columns>
</p:dataTable>
控制器:
@PostConstruct
public void init() {
map = new HashMap<>();
categories = categoryService.getCategories()
.stream()
.filter(c -> c.isForAll())
.sorted((c1, c2) -> c1.getName().compareToIgnoreCase(c2.getName()))
.collect(Collectors.toList());
List<Product> products = productService.getProducts();
categories.stream().forEach(c ->
{
Map<Product, Boolean> valueMap = new HashMap<>();
products.stream().forEach(p ->
{
valueMap.put(p,p.getCategories().contains(c));
});
map.put(c,valueMap);
});
}