经过大量的讨论和测试,我发现$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