【问题标题】:Custom sort methods are not being called in lazy loading Primefaces datatable在延迟加载 Primefaces 数据表中未调用自定义排序方法
【发布时间】:2016-09-24 11:46:13
【问题描述】:

我的 Primefaces 数据表组件中包含用于自定义字符串和数字类型排序的方法调用。非惰性数据表的排序在当前情况下运行良好。但是当我切换到延迟加载时,虽然我有所需的加载实现并且我可以毫无缺陷地延迟加载我的数据,但不会调用自定义排序方法(正确调试)。由于没有调用我自己的方法,因此 PF 自己的排序机制确实会发生排序错误。它对数据进行排序,但对我们的字母表中的外来字符有问题,数字也被视为字符串等。

问题是:如何使用延迟加载正确调用我自己的排序函数?

我正在使用 Primefaces 5.0、JSF 2.2 Mojarra、JDK 1.7、WebLogic 服务器

p.s: 离题属性(过滤器等)被省略。

<p:dataTable id="resourceDataTable" var="result" widgetVar="someWidgetVar"
         value="#{someBean.someDataModel.lazyModel}" paginator="true" rowKey="#{result.id}"
         rowsPerPageTemplate="5,10,15" rows="5" styleClass="incidentDatatableClass"
         paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
         currentPageReportTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
         lazy="true" rowSelectMode="checkbox">

        <p:column width="7">
            <p:selectBooleanCheckbox id="resourceCheckbox" value="#{result.selected}" style="margin-top: 4px;">
                <p:ajax listener="#{copResourceBean.resourceDataModel.selectionChanged(result)}" update=":resourceForm:selectedResourcePanel"/>
            </p:selectBooleanCheckbox>
        </p:column>

        <p:column id="resourceName" headerText="#{language['someHeader']}" sortBy="#{result.name}" 
                  sortFunction="#{helper.sortString}">
            <h:outputText value="#{result.name}" />
        </p:column>

        <p:column id="facilityName"  sortBy="#{result.facilityName}" sortFunction="#{helper.sortString}" headerText="#{language['someHeader']}" >
            <h:outputText value="#{result.facilityName}" />
        </p:column>

        <p:column id="availableQuantity" headerText="#{language['someHeader']}" width="80" sortBy="#{result.availableQuantity}" 
                  sortFunction="#{helper.sortNumeric}" >
            <h:outputText value="#{result.availableQuantity}" />
        </p:column>
    </p:dataTable>

【问题讨论】:

  • 正如预期的那样。使用延迟加载,您需要在 LazyDataModel 的加载方法中进行排序
  • 是的。正如 pg 中明确指出的那样。 161 :) 我错过了 8 分钟的解决方案,因为我正在延迟加载所需的数据! (嗯。好吧,那很糟糕)你能把它作为回应发布,这样我们就可以告诉全世界问题已经解决了吗?primefaces.org/docs/guide/primefaces_user_guide_5_0.pdf

标签: sorting jsf jsf-2 primefaces datatable


【解决方案1】:

自定义排序(或过滤函数/方法)在使用延迟加载时不起作用,它们也不是有意的。在延迟加载的情况下,您应该在 LazyDatamodel 实现的 load 方法中实现排序/过滤。

【讨论】:

  • 恕我直言,这应该记录在案。 LazyDataModelload() 方法之一接收SortMetas,它可能带有排序功能,因此理论上LazyDataModel 实现可以应用自定义排序功能。根据场景,这当然可能需要应用适当的策略来进行有效的分页,但为什么不支持呢?
  • 2 个原因。 1:从未被请求(或问题) 2:与(很少)请求的功能相关的实现复杂性。从来没有记录过这从来都不是问题
  • 没有问题就是问题,直到有人说这是一个问题... LazyDataModel API,无论如何都有很多缺陷,在这方面是不一致的,这种不一致甚至没有记录为期望的行为。这是事实。如果您说它对大多数人来说“足够好”并且您对此感到满意,那很好。不过,我认为这不是改进的正确方法。毕竟,从 JBoss 时代到现在的 PrimeFaces,你从未拥有过……
  • 我并不是说事情不能改进,很可能(是?)改进空间,我并不是说不能添加关于“使用惰性数据模型”的小评论或自定义排序(或过滤)。但是声明它应该被记录是恕我直言光头(即使你添加了恕我直言;-)。并且直截了当地说无论如何都有很多缺陷,而没有说明哪些缺陷(或者更好的是,在问题列表中产生问题)更不利于改进。我对很多事情持开放态度,包括改进
猜你喜欢
  • 2012-10-25
  • 2013-01-09
  • 2016-11-02
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 2023-02-11
  • 2015-01-30
  • 1970-01-01
相关资源
最近更新 更多