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

问题描述

我在用Oracle Apex 18.2.

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

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

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

标签: oracle-apexoracle-apex-18.2

解决方案


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

  1. 如果您快速连续单击 Rowaddrow 按钮两次(第二次在第一次setValue返回之前),则不会初始化第二行。我将在下面向您展示解决方法,但您将
  2. 如果您将时间降低setTimeout到 10 毫秒,并尝试在单击 Rowaddrow 按钮之前将注意力集中在 Expiry Date 列中,您会发现它不起作用。这意味着,虽然setTimeout100 ms 现在可以工作,但如果 IG 的内部逻辑发生变化,将来可能会中断。不太可能,但谁知道呢。

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

我发现以下是最可靠的解决方案。不幸的是,它比你以前的更复杂——但这是我能把它全部解决的唯一方法。随意使用或不使用它。有关示例,请参见第 8 页。

右键单击自定义Rowaddrow按钮并选择Create Dynamic Action。将DA的名称设置为rowAddRow button clicked。将自动为按钮上的单击事件配置“时间”设置

选择新 DA 的操作。将Action设置为Execute JavaScript ,并在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");

创建一个新的 Dynamic Action 并将Name设置为New row initialized。在 When 部分中,将Event设置为Row Initialization [Interactive Grid],将Section Type设置为Region,将Region设置为KITCHEN_SHARE_DTL

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

addRowClicked === true

选择新 DA 的操作。将Action设置为Set Value将 Type 设置Static Assignment,将Value设置为2。在 Affected Elements 中,将Section Type设置为Column(s)并将Column(s)设置为INGREDIENT_ID。这将替换使用$s. 确保禁用初始化时触发。

右键单击 DA 的True分支并选择Create TRUE Action。将Action设置为Set Value将 Type 设置SQL Statement ,并在SQL Statement中输入以下代码:

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

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

右键单击 DA 的True分支并选择Create TRUE Action。将Action设置为Execute JavaScript Code并在Code属性中输入以下 JavaScript 。

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

推荐阅读