如何使用 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-row
或 insert-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 似乎需要一些时间来渲染新行,然后您才能更改任何值。
经过大量讨论和测试,我发现 $s
和 setTimeout
不是很可靠。我再次设置了第 7 页以进行演示。
- 如果快速连续单击 Rowaddrow 按钮两次(第二次在第一次
setValue
returns 之前),第二行将不会被初始化。我将在下面向您展示解决此问题的方法,但您会
- 如果您将
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 Value,Set Type 为 Static Assignment,以及 Value 到 2。在受影响的元素中,将节类型设置为列,将列设置为INGREDIENT_ID。这将替换使用 $s
完成的静态分配。确保禁用初始化时触发。
右键单击 DA 的 True 分支和 select Create TRUE Action。将 Action 设置为 Set Value,Set Type 为 SQL语句,在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
我正在使用 Oracle Apex 18.2.
我有一个交互式网格和一个自定义按钮,用于向 IG 添加新行,使用
apex.region("myRegionStaticId").widget().interactiveGrid('getActions').invoke('row-add-row');
然后使用 $s("myColumnStaticId","2");
设置列的值。当我尝试时,它会添加第一行而不设置任何列的值,并从第二行开始设置值。即使使用 selection-add-row
或 insert-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 似乎需要一些时间来渲染新行,然后您才能更改任何值。
经过大量讨论和测试,我发现 $s
和 setTimeout
不是很可靠。我再次设置了第 7 页以进行演示。
- 如果快速连续单击 Rowaddrow 按钮两次(第二次在第一次
setValue
returns 之前),第二行将不会被初始化。我将在下面向您展示解决此问题的方法,但您会 - 如果您将
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 Value,Set Type 为 Static Assignment,以及 Value 到 2。在受影响的元素中,将节类型设置为列,将列设置为INGREDIENT_ID。这将替换使用 $s
完成的静态分配。确保禁用初始化时触发。
右键单击 DA 的 True 分支和 select Create TRUE Action。将 Action 设置为 Set Value,Set Type 为 SQL语句,在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