Primefaces 数据表中的静态和动态列 [英] Primefaces static and dynamic columns in datatable

查看:16
本文介绍了Primefaces 数据表中的静态和动态列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 Primefaces 5.0 创建动态数据表.

I am using Primefaces 5.0 to create a dynamic datatable.

我的 DataObject 有一些必填字段和一个可选的tupel"(键值对)列表.可选列表的大小可能不同.因此,我需要一种动态机制来显示 Primefaces.DataTable 中的 DataObject 列表.

My DataObject has some required fields and a List of optional "tupel" (key-value pair). The optional list may vary in size. Therefore I need a dynamic mechanism to show a List of DataObject in Primefaces.DataTable.

我的方法如下:

public class DataObject {
    private String staticval1;
    private String staticval2;

    private List<Tupel> optionalValues;


    // .. getter, setter, hashCode, toString.....
}

public class Tupel{
    private String id;
    private String value;
}

@ManagedBean
@ViewScoped
public class TableOverviewBean {
    private List<DataObject> data;

    @EJB
    private IMyDao myDao;

    @PostConstruct
    public void init() {
        data = myDao.findAll();
    }

    public List<DataObject> getData() {
        return data;
    }

    public void setData(List<DataObject> data) {
        this.data = data;
    }
}

    <h:form>
        <p:dataTable value="#{tableOverviewBean.data}" var="data">
            <p:column headerText="static1">
                <h:outputText value="#{data.staticval1}" />
            </p:column>

            <p:column headerText="static2">
                <h:outputText value="#{data.staticval2}" />
            </p:column>

            <p:columns value="#{data.optionalValues}" var="opt" headerText="#{opt.id}">
                <h:outputText value="#{opt.value}" />
            </p:columns>
        </p:dataTable>
    </h:form>

但这行不通.不呈现动态列.我该如何解决我的问题?

But this does not work. The dynamic columns are not rendered. How can I solve my problem?

预期结果:

staticval1 | staticval2 | dynamic_id1 | dynamic_id2 | ... | dynmic_idn
----------------------------------------------------------------------
static1a   | static2a   | dyna_value1a| dyna_value2a | ... | dyna_valu3a
static1b   | static2b   | dyna_value1b| dyna_value2b | ... | dyna_valu3b
static1c   | static2c   | dyna_value1c| dyna_value2c | ... | dyna_valu3c

推荐答案

无法根据行数据定义列.想象一下,第 1 行有 2 列,第 2 行有 6 列,第 3 行有 1 列,等等,您将如何在 HTML 中生成技术上有效的表格?每行必须具有相同数量的列.

It isn't possible to define columns based on row data. Imagine that row 1 has 2 columns, row 2 has 6 columns, row 3 has 1 column, etc how would you ever produce a technically valid table in HTML? Each row must have the same amount of columns.

您有 2 个选项,具体取决于是否可以更改模型:

You've 2 options, depending on whether can change the model or not:

  1. 如果你不能改变模型,那么你需要用一个 替换那个 并使用嵌套循环遍历 #{data.optionalValues} ,例如 或者甚至另一个 :

  1. If you can't change the model, then you need to replace that <p:columns> by a single <p:column> and loop over the #{data.optionalValues} using a nested loop with e.g. <ui:repeat> or perhaps even another <p:dataTable><p:columns>:

<p:column>
    <p:dataTable value=""><!-- Empty string as value forces 1 row. -->
        <p:columns value="#{data.optionalValues}" var="opt" headerText="#{opt.id}">
            #{opt.value}
        </p:columns>
    </p:dataTable>
</p:column>

  • 如果你可以改变模型,那么你需要让 指向一个 bean 属性而不是一个 row 属性,这样它就完全一样了对于每一行.如果您替换 List,这会起作用.optionalValues by MapoptionalValues 其中键是 Tupel#id 并向包含所有可用 Tupel#id 的 bean 添加 List 属性值.

  • If you can change the model, then you need to let <p:columns value> point to a bean property instead of to a row property, so that it's exactly the same for every row. This works if you replace List<Tupel> optionalValues by Map<String, Tupel> optionalValues where the key is Tupel#id and add a List<String> property to the bean containing all available Tupel#id values.

    <p:columns value="#{tableOverviewBean.availableTupelIds}" var="id" headerText="#{id}">
        #{data.optionalValues[id].value}
    </p:columns>
    

  • 这篇关于Primefaces 数据表中的静态和动态列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆