p:SelectBooleanCheckbox : 当布尔值的状态依赖于两个实体的状态时,如何导出布尔值?
p:SelectBooleanCheckbox : How to derive the boolean value when its state depends on the state of two entitys?
我有: 一个数据表,其中包含 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方向的实体来初始化复选框的状态?
问题 2: 如何显示 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);
});
}
我有: 一个数据表,其中包含 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方向的实体来初始化复选框的状态?
问题 2: 如何显示 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);
});
}