oracle-apex - 如何使用 IG 方法将新记录添加到交互式网格中,然后使用 $s() api 设置列的值?
问题描述
我在用Oracle Apex 18.2.
我有一个交互式网格和一个自定义按钮,可以使用向 IG 添加新行,
apex.region("myRegionStaticId").widget().interactiveGrid('getActions').invoke('row-add-row');
然后使用, 设置列的值$s("myColumnStaticId","2");
。当我尝试它时,它会添加第一行而不设置任何列的值,并从第二行开始设置值。即使使用selection-add-row
or 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
withsetTimeout
不是很可靠。我再次设置了第 7 页来演示。
- 如果您快速连续单击 Rowaddrow 按钮两次(第二次在第一次
setValue
返回之前),则不会初始化第二行。我将在下面向您展示解决方法,但您将 - 如果您将时间降低
setTimeout
到 10 毫秒,并尝试在单击 Rowaddrow 按钮之前将注意力集中在 Expiry Date 列中,您会发现它不起作用。这意味着,虽然setTimeout
100 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
推荐阅读
- python-3.6 - 错误:db 类型为 dbm.gnu,但该模块在 windows 中不可用
- javascript - 如何知道我的 gps 朝哪个方向前进?
- c# - 如何关闭标签页?
- r - dplyr 计算某些文本
- python - Python将redis对象转换为原始数据类型
- python - 使用 python 字典
- android-studio - 模拟器:coreaudio:无法初始化播放
- selenium - Can we pass priority and enabled from xls sheet for TestNg test?
- python - 在 Pandas 中通过窗口子句实现 MSSQL 的分区
- excel - 如何正确设置POST参数以接收指定日期的持股信息?