Oracle Apex:访问通过 URL 传递的参数

Rut*_*rni 2 dashboard parameter-passing oracle-apex

我通过 URL 传递参数,页面正确重定向。如何访问下一个(重定向)页面上(从上一页)传递并在 URL 中可用的参数?谁能告诉我如何做到这一点?

或者有没有其他方法可以在页面之间传递参数?

是否有类似于 Angular 广播事件的可用选项?

我不想使用全局页面选项。

Dan*_*han 5

是否有类似于 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 个值

  1. 应用程序
  2. 会议
  3. 要求
  4. 调试
  5. 清除缓存
  6. 物品名称
  7. 项目值
  8. 打印机友好

在上面的 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
Run Code Online (Sandbox Code Playgroud)

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(您应该避免使用 Ajax),这些值必须已进入 DOM。如果 P1_ITEM_NAME 呈现在页面上,则其值应为“Dan”。您可以使用原始 JavaScript 获取此值:

document.getElementById('P1_ITEM_NAME').value
Run Code Online (Sandbox Code Playgroud)

或 jQuery:

$('#P1_ITEM_NAME').val()
Run Code Online (Sandbox Code Playgroud)

但是,最好使用APEX 特定的 JavaScript API,这些API了解 APEX 如何处理复选框和单选组等内容。例如,您可以使用:

$v('P1_ITEM_NAME')
Run Code Online (Sandbox Code Playgroud)

或者你可以使用:

apex.item('P1_ITEM_NAME').getValue()
Run Code Online (Sandbox Code Playgroud)

请记住,如果该项目没有进入 DOM,比如因为它属于另一个页面或因为某个条件,那么您将无法在 JavaScript 中访问它。