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

Oracle apex 如何使用IG方法将新记录添加到交互式网格中,然后设置column';使用$s()api的s值?,oracle-apex,oracle-apex-18.2,Oracle Apex,Oracle Apex 18.2,我正在使用Oracle Apex 18.2。 我有一个交互式网格和一个自定义按钮,可以使用 apex.region(“myRegionStaticId”).widget().interactiveGrid('getActions').invoke('row-add-row')然后使用,$s(“myColumnStaticId”,“2”)设置列的值。当我尝试时,它添加第一行而不设置任何列的值,并从第二行开始设置值。即使使用选择添加行或插入记录,第一行也总是有一些内容。这是一个样本 [https:/

我正在使用Oracle Apex 18.2。

我有一个交互式网格和一个自定义按钮,可以使用

apex.region(“myRegionStaticId”).widget().interactiveGrid('getActions').invoke('row-add-row')
然后使用,
$s(“myColumnStaticId”,“2”)设置列的值。当我尝试时,它添加第一行而不设置任何列的值,并从第二行开始设置值。即使使用
选择添加行
插入记录
,第一行也总是有一些内容。这是一个样本

[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
with
setTimeout
不太可靠。我再次设置了第7页来演示

  • 如果快速连续单击Rowaddrow按钮两次(在第一个
    设置值返回之前的第二次),第二行将不会初始化。我将在下面为您展示一个解决方法,但您将
  • 如果将
    setTimeout
    降低到10毫秒,然后在单击Rowaddrow按钮之前尝试聚焦到期日期列,您会发现它不起作用。这意味着,虽然100 ms的
    setTimeout
    现在可以工作,但如果IGs内部逻辑发生变化,它可能在将来中断。不太可能,但谁知道呢 目前,我想说,
    $s
    只能可靠地用于在IG中为活动行设置列值。当“行添加行”操作添加新记录时,它确实会使其处于活动状态,但这是通过
    setTimeout
    异步完成的。这是因为IG基于flyweight模式,并且内置了许多异步(
    setTimeout
    based)试探法来处理聚焦和模糊事件,以便根据需要正确启用和禁用行和单元格

    我发现以下是最可靠的解决方案。不幸的是,这比你以前遇到的要复杂得多——但这是我唯一能把这一切都弄清楚的方法。请随意使用或不使用。有关示例,请参见第8页

    右键单击自定义行添加行按钮,然后选择创建动态动作。将DA的名称设置为单击的行添加行按钮。将自动为按钮上的单击事件配置When设置

    选择新DA的操作。将操作设置为执行JavaScript,并在代码属性中输入以下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");
    
    addRowClicked = false; // Unset the global
    $x('ADD').disabled = false; // Enable the button
    
    创建一个新的动态动作,并将名称设置为新行初始化。在When部分中,将事件设置为行初始化[交互网格]部分类型设置为区域,将区域设置为厨房共享DTL

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

    选择新DA的操作。将动作设置为设置值设置类型设置为静态赋值设置为2。在受影响的元素中,将节类型设置为,将设置为成分ID。这将替换使用
    $s
    完成的静态分配。确保初始化时点火已禁用

    右键单击DA的True分支,然后选择创建真实操作。将操作设置为设置值设置类型设置为SQL语句,并在SQL语句中输入以下代码:

    select MIN(EXPIRY_DATE) from stock
    where ingredient_id = TO_NUMBER(:INGREDIENT_ID);
    
    项目设置为提交到成分ID并禁用转义特殊字符。在受影响的元素中,将选择类型设置为,将设置为到期日。确保初始化时点火已禁用

    右键单击DA的True分支,然后选择创建真实操作。将操作设置为执行JavaScript代码,并在代码属性中输入以下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");
    
    addRowClicked = false; // Unset the global
    $x('ADD').disabled = false; // Enable the button
    

    谢谢丹的帮助。使用$s()会触发已定义的动态操作。这是我需要的。顺便说一句:John Snyders曾经说过他们在一些api中使用这种方式。DA的When部分是如何设置的?When->click>button>rowAddRow。执行范围=静态。您是在询问某个特定属性吗?因此,您希望此属性被触发一次,即使您正在设置多行的值,对吗?行动是什么?不,一点也不。使用“行添加行”添加新行时,新行将成为活动记录。然后,$s()设置该记录的列值。请看下面Salim的解决方案。这就是为什么当我尝试在单独的“行初始化”DA中设置列的值时,它工作得很好。很高兴知道原因,但取决于具体时间可能不是一个好主意,因为我不知道IG渲染新行所需的确切时间。它可能会多次工作,但有时不会。我认为可能有更好的解决方案,比如回调函数之类的。实际上我推荐Dan McGhan的答案。它多了几行,但更准确。如果你测量性能,它也会更快。我以前用丹的