1

我正在尝试在 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 是单个字符串,并且标题仅使用键值,而不是在包中查找的键列表。

4

1 回答 1

1

@maple_shaft 一针见血。

通过将代码移动到覆盖 DataTable 而不是 DataTableRenderer 的类中,一切正常。嗯,就是在我也加入了ElContext之后。

更新后的代码如下:

@Override
public List<Column> getColumns() {
    if (columns == null) {
        columns = new ArrayList<Column>();

        for (UIComponent child : this.getChildren()) {
            if (child.isRendered() && child instanceof Column) {
                columns.add((Column) child);
            }
        }

        Object columnOrder = this.getAttributes().get("columnOrder");
        if (columnOrder != null) {

            FacesContext context = FacesContext.getCurrentInstance();

            Application application = context.getApplication();
            ExpressionFactory expressionFactory = application.getExpressionFactory();
            ELContext elContext = context.getELContext();

            Column column = new Column();

            Object var = this.getAttributes().get("var");
            String varKey = columnOrder.toString();

            HtmlOutputText header = new HtmlOutputText();
            header.setValue(varKey);
            column.getFacets().put("header", header);

            ValueExpression valExpr = expressionFactory.createValueExpression(elContext, "#{" + var + "." + varKey + "}", String.class);

            HtmlOutputText cell = new HtmlOutputText();
            cell.setValueExpression("value", valExpr);
            column.getChildren().add(cell);

            column.setStyleClass(var + "-" + varKey);
            columns.add(column);

            this.getAttributes().remove("columnOrder");
        }
    }

    return columns;
}
于 2012-07-30T21:24:01.100 回答