You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨页面方法传参调用ViewCriteria按部门ID筛选员工不生效问题

ADF有界任务流跨页按部门ID筛选员工数据失效修复方案

问题场景

在部门、员工两个页面的有界任务流中通过方法调用传参,实现员工数据按departmentId筛选的功能:

  • 员工视图已创建基于绑定变量vcDeptId的筛选视图条件,对应视图对象实现代码:
public void applyViewCriteria(int id)
{
  ViewCriteria vc = getViewCriteria("EmployeesViewFilterByDeptCriteria");
  setvcDepartmentId(id);
  applyViewCriteria(vc);
  executeQuery();
}
  • 部门页面为表格配置了触发方法调用的跳转按钮,对应方法实现代码:
public void filter()
{
  BindingContext bindingContext = BindingContext.getCurrent();
  DCDataControl dc = bindingContext.findDataControl("AppModuleDataControl");
  AppModuleImpl appM = (AppModuleImpl )dc.getDataProvider();
  Object id =appM.getDepartmentsView1().getCurrentRow().getAttribute("DepartmentId");
  appM.getEmployeesView2().applyViewCriteria(Integer.parseInt(id.toString()));
  System.err.println(id);
}

运行时控制台可正确打印选中的部门ID,但跳转至员工页面后表格筛选未生效,展示全量员工数据。

根因说明

问题核心是直接操作数据模型的逻辑绕过了ADF绑定层生命周期,执行的筛选结果被后续页面渲染阶段的默认查询覆盖,具体触发点包括:

  • 直接通过dc.getDataProvider()获取AppModule实例操作视图对象,要么操作的视图对象实例和员工页实际渲染绑定的实例不是同一个,要么方法执行时机早于页面初始化阶段的框架默认查询,筛选后的结果被全量查询重置。
  • 应用视图条件时未设置持久生效标记,框架刷新查询时会自动丢弃临时应用的筛选条件。
  • 有界任务流默认使用隔离的数据控制帧配置,跨页面操作的数据上下文不共享。

修复步骤

按以下顺序调整即可解决问题:

  • 禁止直接通过getDataProvider()拿AppModule实例操作视图对象,将applyViewCriteria方法加入视图对象的客户端接口,通过页面绑定层的方法绑定触发调用,保证筛选逻辑在ADF生命周期的正确阶段执行。
  • 检查有界任务流的data-control-scope配置,若两个页面在同一个有界任务流内,将配置修改为shared,保证两个页面对应的视图对象实例为同一个。
  • 修改applyViewCriteria方法,应用视图条件时指定永久生效标记,同时清空历史条件避免叠加,调整后代码如下:
public void applyViewCriteria(int id)
{
  // 清空已有视图条件,避免条件叠加导致结果异常
  getViewCriteriaManager().clearAllViewCriterias();
  ViewCriteria vc = getViewCriteria("EmployeesViewFilterByDeptCriteria");
  setvcDepartmentId(id);
  // 第二个参数传true,标记视图条件在后续查询中持续生效,不会被框架自动清空
  applyViewCriteria(vc, true);
  executeQuery();
}
  • 检查员工页面对应的员工表格迭代器配置,关闭Refresh After Insert、Refresh on Transaction Active这类会触发初始化全量查询的刷新选项,也可将迭代器的RefreshCondition设置为#{!bindings.EmployeesViewIterator.estimatedRowCount > 0},避免页面加载时重新执行无筛选条件的查询。
  • 若两个页面分属不同的有界任务流,不要通过直接操作AppModule传参,改为在任务流导航规则中配置departmentId为传递参数,员工页加载时通过页面传入的参数调用筛选方法,调用逻辑放在任务流的方法调用活动或者页面的beforePhase监听器中,保证在表格渲染前完成筛选执行。

调试技巧:在applyViewCriteria方法和视图对象的executeQuery方法上加断点,跳转员工页后观察执行顺序,如果筛选方法执行完后又触发了无参数的executeQuery,就说明是框架生命周期的默认查询覆盖了筛选结果,按上述迭代器配置调整即可。

内容的提问来源于stack exchange,提问作者Zavina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 17:06:28