如何在Apex中程序化清除/重置交互式报表的行过滤器
解决方案:程序化重置APEX交互式报表行过滤器(仅离开指定页面时触发)
一、精准重置行过滤器的JavaScript代码
reset-report动作会重置整个报表(包括排序、分页、列显示等),要仅重置行过滤器,需直接操作Interactive Grid的Model和视图:
// 获取Interactive Grid的Grid视图 var igGrid = apex.region("IR").widget().interactiveGrid("getViews", "grid"); // 清除行过滤器 igGrid.model.clearFilters(); // 刷新视图应用更改 igGrid.viewGrid();
二、页面加载时触发的正确时机
预渲染流程是服务器端执行,此时客户端的Interactive Grid尚未初始化,因此无法生效。需在页面加载完成后执行代码,可通过apex.widget.waitFor确保IR初始化完成:
apex.widget.waitFor( // 检查IR是否已准备就绪 function(){ return apex.region("IR") && apex.region("IR").widget().interactiveGrid("isReady"); }, // IR就绪后执行重置逻辑 function(){ var igGrid = apex.region("IR").widget().interactiveGrid("getViews", "grid"); igGrid.model.clearFilters(); igGrid.viewGrid(); } );
将这段代码添加到页面的JavaScript > Execute When Page Loads区域,或创建一个“页面加载后”触发的动态动作(执行JavaScript代码)。
三、仅离开Page 4时重置过滤器的逻辑
要实现仅从Page 4跳转到其他页面时才重置过滤器,可通过sessionStorage标记实现:
步骤1:在Page 4添加页面卸载标记
在Page 4的JavaScript > Execute When Page Loads区域添加:
// 页面卸载前设置标记 window.addEventListener('beforeunload', function() { sessionStorage.setItem('needResetIRFilters', 'true'); });
步骤2:在目标页面添加重置逻辑
在需要重置过滤器的页面(如所有非Page 4的页面)的JavaScript > Execute When Page Loads区域添加:
apex.widget.waitFor( function(){ return apex.region("IR") && apex.region("IR").widget().interactiveGrid("isReady"); }, function(){ // 检查是否来自Page 4的跳转 if(sessionStorage.getItem('needResetIRFilters') === 'true'){ var igGrid = apex.region("IR").widget().interactiveGrid("getViews", "grid"); igGrid.model.clearFilters(); igGrid.viewGrid(); // 清除标记,避免重复触发 sessionStorage.removeItem('needResetIRFilters'); } } );
此逻辑下,仅当从Page 4跳转到其他页面时才会重置过滤器,当前页的分页、刷新操作不会触发重置。
四、解决分页按钮重置过滤器的问题
默认情况下,Interactive Grid的分页操作会保留行过滤器。如果你的分页按钮出现重置过滤器的情况,需检查:
- 确认IR的属性中记住报告设置已启用(在IR属性的“高级”选项卡中)
- 排查是否有自定义JavaScript代码在分页时意外触发了过滤器重置
内容的提问来源于stack exchange,提问作者Bob Veitch
相关产品推荐
相关产品推荐

