同一页面上的两个 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
我有一个页面,其中包含两个数据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.
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 中公开,如下所示: