首页 > 解决方案 > Oracle Apex:访问通过 URL 传递的参数

问题描述

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

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

有没有类似于 Angular 的广播事件的选项?

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

标签: parameter-passingoracle-apexdashboard

解决方案


有没有类似于 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

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 中访问它。


推荐阅读