同一页面上的两个 Primefaces 数据表导致过滤问题

Two Primefaces datatables on same page cause filtering problems

我有一个页面,其中包含两个数据table。他们的数据是延迟加载和分页的。为了检索我需要的行,我覆盖了 load() 函数的 filterMap。我在 LazyResult 列表的初始化中传递了这个 filterMap。不幸的是,这会导致我的 filterMap 出现问题。

详细:

1) 在我的页面上,我得到以下行来初始化两个 LazyList,每个 table

<f:event type="preRenderView" listener="#{handler.initTable1}" />
<f:event type="preRenderView" listener="#{handler.initTable2}" />

2) 在我的 ManageBean 中我正在初始化 LazyList

public void initTable1() {
    filterMap.clear();
    filterMap.put("organization", "IBM");    
    lazyResults1= new ResultsLazyList<MyEntity1, MyBean1, MyDTO1>(
                            myBean1, filterMap);
}

public void initTable2() {
    filterMap.clear();
    filterMap.put("city", "London");    
    lazyResults2= new ResultsLazyList<MyEntity2, MyBean2, MyDTO2>(
                            myBean2, filterMap);
}

在自定义创建的 ResultsLazyList 中,我覆盖了 LazyDataModel 的加载方法。另请注意,我将 filterMap 作为参数传递给构造函数(在加载方法中使用),这样我将从第一个 运行 获得我想要的结果.

问题

现在,如果我的页面中只有一个 table,一切正常。添加更多过滤器、排序等。一旦我添加第二个 table,如上所示,就会发生以下情况。

步骤 1) 当客户端页面加载时,它首先调用 initTable1 方法。 lazyResults1 使用在构造函数中设置的 filterMap 进行初始化。 lazyResults1 的加载方法尚未触发,此时我的 filterMap 的值为 organization=IBM

步骤 2) 当客户端页面加载时,它调用 initTable2 方法。这会用 city=London 覆盖我的 filterMap 的值并初始化 lazyResults2。注意此时lazyResults1或者lazyResults2的load方法还没有被触发

步骤 3) 最后加载方法 lazyResults1 被触发,但是 filterMap 包含在 initTable2 中设置的值。因此,在后端,我的应用程序尝试使用 MyEntity2.

上存在的字段来查询 MyEntity1

问题

1) 有没有办法以某种方式初始化 lazyResults1 并触发加载方法,以便我的 lazyResults1 在调用 initTable2() 之前加载数据并覆盖我的 filterMap ?

2) 我见过一些人使用 ManagedBeans,每个 table,但我想避免这种情况。

3) 另一种方法是在我的 ResultsLazyList 构造函数中两次传递 2 filterMaps。

4) 如果有另一种方法可以覆盖加载方法上的 filterMap,那么我这样做的方式可能会解决我的问题。

两个不同的 tables,两个不同的数据集...那么为什么要在它们之间共享过滤器?通过重复使用相同的 filterMap,您说的是 "I want the same filters to apply to both tables"。如果那不是你想要的,那么为每个 table.

定义单独的 filterMaps

1) Is there a way to somehow initialize lazyResults1 and trigger the load method so that my lazyResults1 is loaded with data before initTable2() is called and overrides my filterMap ?

这些只是技巧,因为您正试图同时拥有它 - 同时共享和不共享过滤器。

假设过滤器在 UI 中公开,如下所示: 并且用户更改了 "Year" 过滤器。您认为此更改会影响其他 table 吗?可能不会。因为这组滤镜只属于这个table