带有多重排序的PrimeFaces数据表格的初始排序顺序

11
我正在尝试在Primeface数据表上实现多重排序。我们正在使用Primefaces v3.5。我已经在LazyLoadClass中创建了一个新的load方法,该方法采用SortMeta>参数列表。但是,在表格的初始加载中出现了问题。当调用load方法时,SortMeta>列表为空。我还尝试过不指定datatable的initial sortBy和sortOrder。在这两种情况下,结果都是相同的。鉴于我们有了这个新的SortMeta类来支持多重排序,我怀疑指定初始排序字段和顺序的方式也已经改变了。但是我找不到任何示例来指出区别。手册3.5没有提到任何差异。为什么我们会得到SortMeta>列表为空?有没有关于使用Lazyload进行多重排序的示例代码的提示?

你需要提供一个 SortMeta 列表来进行排序。 - Cagatay Civici
好的。之前我们是提供列名称的字符串,但现在,据我所知,我们已将其绑定到bean上的List<SortMeta>对象。谢谢!我会尝试这个。 - Murali D
@CagatayCivici 我尝试了 <p:dataTable var="trans" value="#{archiveBean.transactionModel}" lazy="true" sortMode="multiple" sortBy="#{hubArchiveBean.preSortOrder}" > 并创建了 preSortOrder 作为 private void buildSortOrder() { SortMeta sm1 = new SortMeta(); sm1.setSortField("resolvedDateTime"); m1.setSortOrder(SortOrder.DESCENDING); preSortOrder.add(sm1); } 但是由于 DataTableRenderer 中的 encodeColumnHeader 方法正在访问 UIColumn,如 sortIcon = resolveDefaultSortIcon(columnSortByVe, meta.getColumn().getValueExpression("sortBy"), meta.getSortOrder().name());,因此会抛出 NPE。 - Murali D
1个回答

22
我成功让它工作了。
实际上,我们需要在SortMeta对象中提供UIColumn才能使其工作。对于渲染时的初始排序,我不得不在我的bean中找到组件并将其分配给sortMeta。
下面是我在视图xhtml中的代码:
        <p:dataTable id="transDataTable" var="trans" 
        value="#{myBean.transModel}" paginator="true" rows="50"
        paginatorAlwaysVisible="false" lazy="true"
        sortMode="multiple" sortBy="#{myBean.preSortOrder}" 
        resizableColumns="true">

        <p:column headerText="User" sortBy="#{trans.user.name}" >
            #{trans.user.name}
        </p:column>
        <p:column headerText="Company" sortBy="#{trans.companyName}">
            #{trans.companyName}
        </p:column>
        <p:column headerText="Join Date" id="joinDateTime" 
            sortBy="#{trans.joinDateTime}" >
            <h:outputText value="#{trans.joinDateTime}" />
        </p:column>
    </p:dataTable>

这是我的Java Bean代码,在@PostConstruct中被调用。
        /*
     * method to build initial sort order for multisort
     */
    private void buildSortOrder() {
        UIViewRoot viewRoot =  FacesContext.getCurrentInstance().getViewRoot();
        UIComponent column = viewRoot.findComponent("transDataTable:joinDateTime"); 

        SortMeta sm1 = new SortMeta();
        sm1.setSortBy((UIColumn)column);
        sm1.setSortField("joinDateTime");
        sm1.setSortOrder(SortOrder.DESCENDING);
        preSortOrder.add(sm1);          
    }

我不确定这是否是正确的做法,但它有效。当我们需要在bean代码中使用视图中的ID时,我通常会感到不舒服,因为这可能会在人们不小心的情况下引入错误。感谢@CagatayCivici的快速提示。

2
没错,抱歉我没有时间提供完整的示例,只能提供一个提示。感谢分享详细的例子。 - Cagatay Civici
1
@Murali D,你的preSortOrder方法中正在发生什么?你能发布一下代码吗? - Z3RP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接