我正在尝试在 dataTable 中扩展 PrimeFaces 的列组件 - 主要是为了创建标题并根据键值自动插入对象的字段,而无需手动插入列标签及其关联的方面。
我的自定义组件覆盖 DataTableRenderer 中有以下内容:
@Override
public void encodeEnd(FacesContext context, UIComponent component)
throws java.io.IOException {
Object columnOrder = component.getAttributes().get("columnOrder");
if (columnOrder != null) {
component.getChildren().clear();
Application application = context.getApplication();
ExpressionFactory expressionFactory = application.getExpressionFactory();
Column column = new Column();
Object var = component.getAttributes().get("var");
String varKey = columnOrder.toString();
UIOutput header = (UIOutput) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
header.setValue(varKey);
column.getFacets().put("header", header);
ValueExpression valExpr = expressionFactory.createValueExpression("#{" + var + "." + varKey + "}", String.class);
UIOutput cell = (UIOutput) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
cell.setValueExpression("value", valExpr);
column.setStyleClass(varKey);
column.getChildren().add(cell);
component.getChildren().add(column);
component.getAttributes().remove("columnOrder");
}
super.encodeEnd(context, component);
}
我这么称呼它
<my:dataTable var="item" value="#{myBean.collection}" columnOrder="field" />
标头设置正确,但单元格按字面意思输出#{item.field}而不是评估表达式。
列组件上的 setStyleClass 也没有达到预期的效果。
我猜我抓住了错误的一端,并且在这件事上走错了路。
注意。在这个简化的示例中,我假设 columnOrder 是单个字符串,并且标题仅使用键值,而不是在包中查找的键列表。