p:SelectBooleanCheckbox:当布尔值的状态取决于两个实体的状态时,如何派生布尔值



我有:一个包含属性的实体在方向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);
        });
}

最新更新