我正在尝试使用<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}}
答案 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>