使用对象的list-property时<p:columns>将不会呈现</p:columns>

时间:2013-10-24 10:25:45

标签: jsf-2 primefaces

我正在尝试使用<p:columns>,但当我使用List提供时,无法呈现<p:dataTable>是封闭的<ui:repeat>对象的属性迭代。

可以在<p:dataTable>中成功使用该列表,或使用<p:column>访问<p:columns>内的其中一个条目。将列表分配给辅助bean的属性时Car 但是当使用Dynamic Columns - 对象的属性时,不会在该位置呈现任何内容。没有错误消息等。

Primefaces 4.0 User Guide中关于cars[colIndex]的{​​{1}}部分与代码示例中使用的<p:columns>混淆,但cars的值除了<p:columns>以外 - 我不知道如何使用它。

其他信息:
我需要<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://primefaces.org/ui"> <h:head></h:head> <h:messages /> <h:form> <!-- works --> <ui:repeat value="#{carBean.cars}" var="car"> ui:repeat: #{car.features} </ui:repeat> <p:dataTable value="#{carBean.cars}" var="car"> <!-- works too --> <p:column> p:column: #{car.features.get(0)} </p:column> <!-- works too --> <p:columns value="#{carBean.beanFeatures}" var="feature" columnIndexVar="colIndex"> carBean p:columns: #{feature} </p:columns> <!-- renders nothing --> <p:columns value="#{car.features}" var="feature" columnIndexVar="colIndex"> car p:columns: #{feature} </p:columns> </p:dataTable> </h:form> </html> 的列列表成为类的一部分,因为我想重用具有不同属性的几个类的代码,因此需要不同的列。

Facelets代码:

package myPackage;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class CarBean implements Serializable {

    List<Car> cars;
    List<String> beanFeatures;

    @PostConstruct
    public void init(){
        cars = new ArrayList<Car>();
        Car car1 = new Car();
        car1.features.add("windows");
        car1.features.add("fridge");
        Car car2 = new Car();
        car2.features.add("wheels");
        car2.features.add("nuclear engine");
        cars.add(car1);
        cars.add(car2);
        beanFeatures = car1.getFeatures();
    }

    public List<Car> getCars() {
        return cars;
    }

    public void setCars(List<Car> cars) {
        this.cars = cars;
    }

    public List<String> getBeanFeatures() {
        return beanFeatures;
    }

    public void setBeanFeatures(List<String> beanFeatures) {
        this.beanFeatures = beanFeatures;
    }

}

支持bean:

Car

package myPackage; import java.util.ArrayList; import java.util.List; public class Car { List<String> features = new ArrayList<String>(); public List<String> getFeatures() { return features; } public void setFeatures(List<String> features) { this.features = features; } }

{{1}}

1 个答案:

答案 0 :(得分:1)

这基本上不是Primefaces动态列的工作方式。您的动态列必须直接绑定到Managed Bean的属性。对于每次汽车迭代,没有选择以恐怖的方式建立这个价值。

因此,简而言之,不可能为不同的表值使用不同的列。表格列可以以dinamically方式呈现,但必须在PrimeFaces开始循环遍历值之前确定

如果你看一下Primefaces showcase,你会发现它。

但是,可以使用ui:repeat在同一列中循环使用汽车的功能,因此您可以将所有功能放在一列中:

<p:column>  
    <ui:repeat value="#{car.features}" var="feature">
        #{feature}
    </ui:repeat>
</p:column>