parameter-passing - Oracle Apex:访问通过 URL 传递的参数
问题描述
我通过 URL 传递参数并且页面被正确重定向。如何访问通过(从上一页)传递并在 URL 中可用的下一个(重定向的)页面上的参数?谁能告诉我该怎么做?
或者有没有其他方法可以在页面之间传递参数?
有没有类似于 Angular 的广播事件的选项?
我不想使用全局页面选项。
解决方案
有没有类似于 Angular 的广播事件的选项?
并不真地。尽管您可以使用 APEX 来做到这一点,但这可能是矫枉过正。Angular 是一个进行客户端渲染的 SPA 框架,而 APEX 主要进行服务器端渲染。如果你来自 Angular 世界,你将不得不重新考虑一些事情。
如何访问通过(从上一页)传递并在 URL 中可用的下一个(重定向的)页面上的参数?
第一个问题是:您是否尝试使用 JavaScript 或 SQL & PL/SQL 访问这些值?我会回答这两个问题,但首先我会退后一步来解释APEX 中的会话状态。以下内容过于简单,但应该有助于让您了解幕后发生的事情。
请记住,APEX 引擎是 Oracle 数据库中的一个模式,其中包含许多表(主要用于存储应用程序元数据)、包(用于业务逻辑和 HTML 生成)和其他数据库对象。在这些表中,有一些用于存储“会话状态”。将两个主表视为 SESSIONS 和 SESSION_DATA。SESSIONS 将具有会话、用户名等的唯一标识符。SESSION_DATA 将具有指向 SESSIONS 表的 SESSION 列、ITEM_NAME 列和 ITEM_VALUE 列。
假设您访问以下 URL: https ://yourdomain.com/apex/f?p=101:1:12690960447054
APEX 引擎将获取 URL 的“p”参数并将其解析为最多 9 个值:
- 应用程序
- 页
- 会议
- 要求
- 调试
- 清除缓存
- 项目名称
- 项目值
- 打印机友好
在上面的 URL 中,仅指定了其中三个值,因此 APEX 引擎为会话 12690960447054 的应用程序 101 中的页面 1 生成 HTML。
但是,如果您使用以下 URL 会怎样: https ://yourdomain.com/apex/f?p=101:1:12690960447054::::P1_ITEM_NAME:Dan
在这种情况下,APEX 引擎将在生成 HTML 之前更新 SESSION_DATA 表中的会话状态。它将 ITEM_VALUE 列设置为“Dan”,其中 SESSION 为 12690960447054,ITEM_NAME 为“P1_ITEM_NAME”。
这就是当您通过 URL 设置会话状态时在技术上发生的事情。当您准备好了解有关会话状态的更多信息时,请查看Anton Nielsen的这篇旧但仍然相关的帖子。现在让我们继续讨论有关访问会话状态的问题......
SQL & PL/SQL
一旦 APEX 设置了会话状态,它就会继续生成 HTML。假设您在页面上有一个带有以下查询的报告区域:
select col1, col2, col3
from some_table
where col4 = :P1_ITEM_NAME
APEX 引擎将识别查询中的绑定变量,并根据会话从 SESSION_DATA 表中提供正确的值。坦率地说,您可以从任何页面访问项目的值,以及应用程序项目,因为此时我们是服务器端的,这真的没有区别。话虽如此,最佳做法是仅引用当前页面中的页面项目。
有关访问会话状态服务器端的更多方法,请参阅“引用项值”: https ://docs.oracle.com/en/database/oracle/application-express/19.1/htmdb/understanding-page-level-items.html #GUID-207E66F9-C8A6-4FD1-B2F4-12D4BB302D31
JavaScript
生成 HTML 后,将其发送到浏览器进行渲染。要让 JavaScript 在不使用 Ajax 的情况下从会话状态访问值(您应该尽量避免),这些值必须已进入 DOM。如果在页面上呈现 P1_ITEM_NAME,则其值应为“Dan”。您可以使用原始 JavaScript 获取此值:
document.getElementById('P1_ITEM_NAME').value
或 jQuery:
$('#P1_ITEM_NAME').val()
但是,最好使用APEX 特定的 JavaScript API,这些 API 了解 APEX 如何与复选框和单选组等内容配合使用。例如,您可以使用:
$v('P1_ITEM_NAME')
或者你可以使用:
apex.item('P1_ITEM_NAME').getValue()
请记住,如果该项目没有进入 DOM,比如因为它属于另一个页面或因为某种条件,那么您将无法在 JavaScript 中访问它。
推荐阅读
- javascript - 如何将数据保存在 JSON 文件中,以便每次我的 Discord Bot 注销时都不会重置数据
- java - Java流groupingBy并对多个字段求和
- css - 获取内联样式 CSS 属性
- pytorch - 如何使用脚本转换 pytorch 转换器?
- security - 如何在创建后向帐户添加密钥,例如多重签名合约,使用近壳、近 repl 或近 api-js?
- linux - Docker daemon 不断写入磁盘并导致 shell 命令运行缓慢
- powershell - Powershell:在条形图上放置第二个 X 轴
- javascript - 如何使用 Office.js 从 Excel 中的多个 NamedItem 获取格式?
- oracle - 如何将批量逗号分隔值作为参数传递给 Oracle 存储过程?
- javascript - 在 Javascript 中覆盖数组值