3.5.3.4.4. 在数据加载器中使用界面参数

很多时候需要根据界面传递的参数加载界面需要的数据。下面是一个浏览界面的示例,使用了界面参数并且在加载数据时使用参数来过滤数据。

假设有两个实体:CountryCityCity 实体有 country 属性,是 Country 的引用。在 city 的浏览界面,可以接受一个 country 的实例,然后只展示该 country 的 city。

首先,看看 city 界面的 XML 描述。其数据加载器包含一个带有参数的查询:

  1. <collection id="citiesDc"
  2. class="com.company.demo.entity.City"
  3. view="_local">
  4. <loader id="citiesDl">
  5. <query>
  6. <![CDATA[select e from demo_City e where e.country = :country]]>
  7. </query>
  8. </loader>
  9. </collection>

city 界面控制器有一个 public 的参数setter,然后在 BeforeShowEvent 处理器中使用了参数。注意,该界面没有 @LoadDataBeforeShow 注解,因为需要显式的触发数据加载:

  1. @UiController("demo_City.browse")
  2. @UiDescriptor("city-browse.xml")
  3. @LookupComponent("citiesTable")
  4. public class CityBrowse extends StandardLookup<City> {
  5. @Inject
  6. private CollectionLoader<City> citiesDl;
  7. private Country country;
  8. public void setCountry(Country country) {
  9. this.country = country;
  10. }
  11. @Subscribe
  12. private void onBeforeShow(BeforeShowEvent event) {
  13. if (country == null)
  14. throw new IllegalStateException("country parameter is null");
  15. citiesDl.setParameter("country", country);
  16. citiesDl.load();
  17. }
  18. }

city 界面可以从其他界面为其传递一个 country 实例并打开,示例:

  1. @Inject
  2. private ScreenBuilders screenBuilders;
  3. private void showCitiesOfCountry(Country country) {
  4. CityBrowse cityBrowse = screenBuilders.screen(this)
  5. .withScreenClass(CityBrowse.class)
  6. .build();
  7. cityBrowse.setCountry(country);
  8. cityBrowse.show();
  9. }