我拥有的内容:一个数据表,其中包含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
我尝试了什么:显示一个布尔值,因为它是主要要求,但它的状态是由听众改变的。
<p:selectBooleanCheckbox value="#{productController.hasProperty}">
<p:ajax event="???" listener="#{productController.change(product, cat)}"/>
</p:selectBooleanCheckbox>
问题:我需要在加载数据表时初始化布尔值。
问题1:有没有办法在加载数据表时初始化复选框的状态,具体取决于X和Y方向的实体?
问题2:如何显示2D SelectBooleanCheckBox,其中复选框的状态来自实体和属性的状态?
谢谢
答案 0 :(得分:0)
解决了!
因为我使用了两个实体(产品和类别)
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);
});
}