如何不提交页面刷新Oracle Apex中PL/SQL动态内容区域
Oracle Apex v21.1 动态生成文本框的无刷新实现方案
完全可以通过原生功能实现你需要的近似无刷新的动态渲染效果,无需额外第三方插件,两种常用实现方案如下:
方案1:原生PL/SQL动态内容区域刷新(最简便,推荐)
Apex 18.x及以上版本的PL/SQL动态内容区域本身支持原生局部刷新,不存在无法局部刷新的问题,操作步骤:
- 给你的PL/SQL动态内容区域设置静态ID,例如
DYNAMIC_TEXT_CONTAINER - 打开区域的「要提交的页面项」属性,填入你用来控制数量的LOV项名称(例如
P1_SELECT_COUNT),同时开启「仅当该区域的项值发生变化时刷新」开关 - 区域内的PL/SQL代码直接按你的需求写,调用
HTP.P输出带自定义CSS类的APEX_ITEM.TEXT组件,示例代码:
DECLARE l_count NUMBER := NVL(:P1_SELECT_COUNT, 0); BEGIN FOR i IN 1..l_count LOOP HTP.P('<div class="t-Form-item t-Form-item--left">'); HTP.P(APEX_ITEM.TEXT( p_idx => 1, p_size => 30, p_attributes => 'class="apex-item-text apex-item--size-30" placeholder="请输入第'||i||'项内容"' )); HTP.P('</div>'); END LOOP; END;
- 新建动态动作(DA),触发条件为LOV项的值改变事件,执行动作为「刷新」,目标选择你配置好的PL/SQL动态内容区域即可。刷新时仅会异步重新渲染该区域内容,不会刷新整个页面,体验和交互式报表刷新完全一致。
方案2:Set Value DA实现(适合需要更精细控制渲染逻辑的场景)
如果你不想用区域刷新,也可以通过Set Value动态动作实现完全无刷新的HTML注入:
- 新建一个页面显示项,类型选择「显示HTML」,设置为隐藏(无需展示标签),分配静态ID例如
DYNAMIC_HTML_HOLDER - 新建应用进程,类型设置为「按需执行的AJAX回调」,命名为
GET_DYNAMIC_TEXTS,代码逻辑为生成对应数量的文本框HTML,示例代码:
DECLARE l_html CLOB; l_count NUMBER := NVL(:P1_SELECT_COUNT, 0); BEGIN FOR i IN 1..l_count LOOP l_html := l_html || '<div class="t-Form-item t-Form-item--left">' || APEX_ITEM.TEXT( p_idx => 1, p_size => 30, p_attributes => 'class="apex-item-text apex-item--size-30" placeholder="请输入第'||i||'项内容"' ) || '</div>'; END LOOP; HTP.P(l_html); APEX_APPLICATION.STOP_APEX_ENGINE; END;
- 新建动态动作,触发条件为LOV项的值改变事件,执行动作选择「设置值」:
- 值类型选择「AJAX回调」
- 回调名称选择你刚创建的
GET_DYNAMIC_TEXTS - 「要提交的项」选择你的LOV项(例如
P1_SELECT_COUNT) - 「设置值的目标」选择你新建的HTML显示项
- 执行DA时会异步拉取生成的HTML代码注入到页面,全程无页面跳转或全局刷新。
取值注意事项
两种方案的后端取值逻辑和你之前用交互式报表的逻辑完全兼容,提交页面后通过APEX_APPLICATION.G_F01数组即可遍历所有动态生成的文本框的值,无需修改原有提交处理逻辑。
内容的提问来源于stack exchange,提问作者ThomasT
相关产品推荐
相关产品推荐

