从模态对话框获取父页面Interactive Grid时apex.region返回null的解决方法
解决APEX模态对话框访问父页面交互网格的问题
这个问题的核心原因很清晰:APEX的模态对话框是作为独立iframe页面加载的,它的JavaScript上下文和父页面完全隔离。你直接调用apex.region("pg_2_ig_grid")时,代码是在模态框的页面上下文中执行的,自然找不到父页面的网格region,所以返回null。
下面给你几个可行的解决方案,按推荐程度排序:
1. 直接访问父页面的JavaScript上下文(最直接)
因为模态框是由父页面打开的iframe,你可以通过parent对象直接访问父页面的window上下文,进而调用父页面的APEX API。把你的代码修改成这样:
// 明确指向父页面的apex对象 var ig$ = parent.apex.region("pg_2_ig_grid").widget(); var view = ig$.interactiveGrid("getCurrentView");
这样就能正确获取到父页面上的交互网格实例了。需要注意的是,这个方法要求模态框和父页面是同域的(APEX默认就是这样,所以不用担心跨域问题)。
2. 确保代码执行时机正确
有时候即使你用了parent,还是可能因为父页面的网格还没完全加载完成,导致parent.apex.region返回null。这种情况下,你可以用APEX的apex.util.waitFor工具函数,等待父页面的网格region存在后再执行代码:
apex.util.waitFor( // 检查父页面的网格region是否已存在 function() { return parent.apex.region("pg_2_ig_grid") !== null; }, // 存在后执行的逻辑 function() { var ig$ = parent.apex.region("pg_2_ig_grid").widget(); var view = ig$.interactiveGrid("getCurrentView"); // 这里添加你需要的业务逻辑 }, // 配置:每500ms检查一次,超时10秒 { interval: 500, timeout: 10000 } );
3. 打开模态框时传递必要数据(适合仅需数据的场景)
如果你不需要操作网格实例,只是需要网格里的数据,可以在打开模态框的时候,把需要的数据通过URL参数或者APEX会话状态传递过去:
- 比如在父页面打开模态框的按钮中,设置URL参数:
f?p=&APP_ID.:MODAL_PAGE:&SESSION.::NO::P_MODAL_GRID_DATA:{网格数据},然后在模态框页面通过$v("P_MODAL_GRID_DATA")获取。 - 或者用
apex.server.process在父页面把网格数据存入会话状态,模态框页面再读取。
这种方法避免了跨上下文操作,适合只需要数据的场景。
为什么共享组件里的代码也不行?
你把代码放到共享组件里,其实代码还是在模态框页面的上下文中执行的,并没有改变执行环境,所以还是找不到父页面的region。必须明确指定parent才能切换到父页面的上下文。
内容的提问来源于stack exchange,提问作者Coding Duchess
相关产品推荐
相关产品推荐

