如何使用 IG 方法将新记录添加到交互式网格中,然后使用 $s() api 设置列的值?

How to add a new record into an interactive grid using IG methods then set column's value using $s() api?

我正在使用 Oracle Apex 18.2.

我有一个交互式网格和一个自定义按钮,用于向 IG 添加新行,使用

apex.region("myRegionStaticId").widget().interactiveGrid('getActions').invoke('row-add-row'); 然后使用 $s("myColumnStaticId","2"); 设置列的值。当我尝试时,它会添加第一行而不设置任何列的值,并从第二行开始设置值。即使使用 selection-add-rowinsert-record,第一行总是有一些东西。这是一个示例,

[https://apex.oracle.com][1]
ws = ESLAM_WS
user = forhelp
pwd = forhelppwd
app = TEST
page = Add Row on top of an IG.

更改以下代码:

$s("INGREDIENT_ID","2");

与以下一个:

setTimeout(function(){ $s("INGREDIENT_ID","2"); }, 100);

IG 似乎需要一些时间来渲染新行,然后您才能更改任何值。

经过大量讨论和测试,我发现 $ssetTimeout 不是很可靠。我再次设置了第 7 页以进行演示。

  1. 如果快速连续单击 Rowaddrow 按钮两次(第二次在第一次 setValue returns 之前),第二行将不会被初始化。我将在下面向您展示解决此问题的方法,但您会
  2. 如果您将 setTimeout 降低到例如 10 毫秒,并尝试在单击 Rowaddrow 按钮之前将注意力集中在到期日期列中,您会发现它不起作用。这意味着,虽然 100 毫秒的 setTimeout 现在有效,但如果 IG 的内部逻辑发生变化,它可能会在未来崩溃。不太可能,但谁知道呢。

目前,我会说 $s 只能可靠地用于在 IG 中为活动行设置列值。当 row-add-row 操作添加新记录时,它确实使它处于活动状态,但这是通过 setTimeout 异步完成的。这是因为 IG 基于 flyweight 模式,并且有许多内置的异步(setTimeout)启发式处理焦点和模糊事件以根据需要正确启用和禁用行和单元格。

我发现以下是最可靠的解决方案。不幸的是,它比你以前拥有的更复杂 - 但这是我可以将它们放在一起的唯一方法。随意使用或不使用它。有关示例,请参见第 8 页。

右键单击自定义 Rowaddrow 按钮和 select 创建动态操作 。将 DA 的 Name 设置为 rowAddRow button clicked。将自动为按钮上的单击事件配置 When 设置。

Select 新 DA 的操作。将Action设置为ExecuteJavaScript并在Code中输入以下JavaScript ]属性。

addRowClicked = true; // Global used to distinguish custom button click
this.triggeringElement.disabled = true; // Disable button to serialize access
apex.region("KITCHEN_SHARE_DTL").widget().interactiveGrid("getActions").invoke("row-add-row");

创建一个新的动态操作并将名称设置为已初始化新行。在 When 部分中,将 Event 设置为 Row Initialization [Interactive Grid],将 Section Type 设置为 地区地区KITCHEN_SHARE_DTL.

在客户端条件下,将类型设置为JavaScript表达式并在[=45=中输入以下代码]JavaScript 表达式(确保 DA 仅在单击 Rowaddrow 按钮时触发):

addRowClicked === true

Select 新 DA 的操作。将 Action 设置为 Set ValueSet TypeStatic Assignment,以及 Value2。在受影响的元素中,将节类型设置为,将设置为INGREDIENT_ID。这将替换使用 $s 完成的静态分配。确保禁用初始化时触发

右键单击 DA 的 True 分支和 select Create TRUE Action。将 Action 设置为 Set ValueSet TypeSQL语句,在SQL语句中输入以下代码:

select MIN(EXPIRY_DATE) from stock
where ingredient_id = TO_NUMBER(:INGREDIENT_ID);

要提交的项目设置为INGREDIENT_ID并禁用转义特殊字符 .在受影响的元素中,将 Selection Type 设置为 Column(s)Column(s)EXPIRY_DATE。确保禁用初始化时触发

右键单击 DA 的 True 分支和 select Create TRUE Action。将 Action 设置为 Execute JavaScript Code 并在 Code[=101] 中输入以下 JavaScript =] 属性.

addRowClicked = false; // Unset the global
$x('ADD').disabled = false; // Enable the button