1

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

详细地:

1)在我的页面上,我得到以下几行来初始化两个 LazyLists,每个表都用于

<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作为参数传递(在 load 方法中使用),这样我从第一次运行时就会得到我想要的结果。

问题

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

步骤 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并触发加载方法,以便在调用initTable2()之前加载我的lazyResults1数据并覆盖我的filterMap?

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

3) 另一种方法是在我的 ResultsLazyList 构造函数中通过 2 个 filterMaps。

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

4

1 回答 1

3

两个不同的表,两个不同的数据集……那为什么要在它们之间共享过滤器呢?通过重复使用相同的filterMap内容,您是在说“我希望将相同的过滤器应用于两个表”。如果这不是您想要的,则为每个表定义单独的 filterMaps。

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

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

假设过滤器像这样在 UI 中公开:过滤器 并且用户更改了“年份”过滤器。您是否希望此更改会影响其他一些表?可能不是。因为这组过滤器只属于这个表。

于 2017-04-28T13:30:53.820 回答