如何在过滤 lazy dataTable 后更新其他组件(primefaces)

4

在过滤懒加载数据表之后,是否有可能更新其他组件?

<p:dataTable id="dataTable" value="#{NewsBean.items}" binding="#{NewsBean.items.dataTable}" lazy="true" filteredValue="#{NewsBean.filter}" var="item" paginator="true" rows="10"
            currentPageReportTemplate="(Displaying results {startRecord} - {endRecord} of {totalRecords})"
            paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
            rowsPerPageTemplate="10,20,50,100,200,500,1000" filterEvent="enter">

            ...

            <p:ajax event="filter" update="some_other_component" />

            ...

</p:dataTable>
<p:blockUI block="dataTable" trigger="dataTable" />

具体问题是:我的dataTable完成惰性筛选之前,过滤事件就已触发,因此另一个组件的更新事件会过早触发。因此,该组件无法显示特定于过滤器的内容。再次进行过滤将显示一步之前的结果。
我发现BalusC提供了使用远程命令的解决方案。
<p:ajax event="filter" oncomplete="updateFilterSelection()" />
<p:remoteCommand name="updateFilterSelection" update="some_other_component" />

但是使用这个解决方案会导致我的blockUI无限加载。似乎oncomplete事件不再触发了。有没有其他的解决办法?我正在使用primefaces 3.5。谢谢。
编辑:我找到了一个适合我的解决方案,它可以按照预期工作。
<p:ajax event="filter" listener="#{some_Method}" update="some_other_component" />

some_Method调用了refresh,例如在当前视图上进行重定向。但我确定这会创建很多开销。

2个回答

2

我曾经遇到类似的问题:

如何在惰性数据加载后更新用户界面。
似乎没有适用于 Primefaces 的事件。

这是我的解决方案:

  • 在您的 LazyDataModel load() 方法中添加以下内容: RequestContext.getCurrentInstance().execute("updateUserInterface()");
  • 在您的视图中创建一个 JavaScript 函数:
    function updateUserInterface() {
    // 用于更新用户界面的命令
    }

-2
update=":#{p:component('size')}"

这里的 size 是 outputText 文本框的 id。


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