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

时间:2015-09-03 09:28:00

标签: jsf primefaces

我拥有的内容:一个数据表,其中包含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,其中复选框的状态来自实体和属性的状态?

谢谢

1 个答案:

答案 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);
        });
}