视图字段事件

图片.png

Ninext 为 Ninox 的视图添加了事件:点击视图字段中的某一行(onclick),以及在表视图中选中某条记录(onselected)。在您的公式中,这些函数必须完全按此书写,全部小写。

这些事件可以在 Ninext 设置的“界面增强”部分中停用:视图事件 (onClick, onSelect)(默认启用)。

点击视图字段中的一行:onclick

传给 onclick 的 JSON 属性速览

属性说明示例 / 用法
previousID点击之前在视图中选中的记录的 ID;如果之前没有选中记录,则为空。“A1”
targetID被点击记录的 ID。“A3”
targetLineNum用户点击的行号(从 0 开始)。3
targetColumnNum视图中被点击的列号(从 0 开始)。4
targetColumnValue被点击单元格中显示的文本值。“Lisa”
targetColumnCaption来自字段配置的列标题(取自 "caption" 或 "field.caption")。“First Name”

总体流程

  1. 在视图字段公式中定义 onclick 函数
    onclick 函数必须写入视图字段的公式中。它接收一个对象(名为 "event"),其中包含上述各项属性。在这个函数中,this 指的是包含该视图字段的记录,而不是被点击的那一行:被点击的行要通过 event.targetID 找到。
  2. 执行自定义代码
    当用户在视图中点击或轻触某个单元格时,Ninext 的钩子会执行 onclick 函数。脚本随后可以,例如:
    • 更新某条记录的属性(例如切换一个布尔字段)。
    • 把被点击记录的 ID 存入指定字段。
    • 根据被点击的列触发条件动作。
  3. 返回视图内容
    函数末尾,公式必须返回视图的内容(例如 "select Customer")。这告诉 Ninox 在脚本执行后应显示哪些记录。

实现示例

完整示例

Ninox
function onclick(event : any) do
    'ID of selected customer' := event.targetID;
    var selCustomer := first(select Customer where Id = event.targetID);
    debug("onclick");
    if event.targetColumnCaption like "checked" then
        selCustomer.(Checked := not Checked);
        true
    else
        if event.targetColumnNum = 0 then
            true
        else
            false
        end
    end
end;
select Customer

说明:

  • 该函数首先把被点击记录的 ID 存入字段 "ID of selected customer"。
  • 然后从 "Customer" 表中取出相应的记录。
  • 如果被点击单元格的列标题包含 "checked",则切换该记录上的 "Checked" 字段,并返回 true 表示该点击已被处理。
  • 否则,函数根据被点击的列号是否为 0 返回 true 或 false。
  • 最后,公式返回 "select Customer",在脚本执行后显示视图的内容。

最简示例

Ninox
function onclick(event : any) do
     'ID of selected customer' := event.targetID;
     debug("Clicked on Customer " + event.targetID);
     "No specific action is performed here.";
     false
 end;

select Customer

说明:

  • 这段脚本只是存下被点击记录的 ID,并记录一条调试信息。
  • 返回 false 会让未被专门处理的动作按默认行为继续进行。
  • 与往常一样,公式以 "select Customer" 结尾,以显示视图的内容。

需要记住的要点

  • 在视图字段公式中的位置:
    onclick 函数必须直接定义在视图字段的公式中,而不是在触发器或应用的其他部分。
  • 返回视图内容:
    与其他期望返回布尔值的函数不同,公式的最后一行必须返回视图的内容(例如 "select Customer")。
  • onclick 返回的值:
    true 表示该点击已被处理:Ninox 不会打开被点击的记录。false 或不返回任何值,则让 Ninox 执行其通常的行为,打开该记录。点击分组行不会调用 onclick。
  • 单独求值的函数:
    Ninext 只从公式中提取 onclick 函数,然后单独对它求值。因此,它看不到公式中其他地方声明的变量或其他函数:请在 onclick 内部声明它所需要的一切。
  • 利用事件参数:
    利用 "event" 对象提供的信息(previousID、targetID、targetLineNum、targetColumnNum、targetColumnValue、targetColumnCaption),根据点击的上下文来调整您的动作。
  • 在不同设备上测试:
    请确保该函数在桌面设备和触摸设备上都能正常工作,因为该钩子同时处理 "click" 和 "touchend" 事件。

在表视图中选中记录:onselected

每当在表视图(表中记录的列表)中选中一行时,Ninext 都会调用函数 onselected()。请在表的读取权限公式(“Readable if”)中声明它,不带参数。在这个函数中,this 指的是被选中的记录。它返回的值不会被使用,Ninox 会照常打开该记录。

Ninox
function onselected() do
    debug("customer->onselect : " + this)
end;
true

在这里,只要 Ninext 面板处于打开状态,每次选中都会在调试跟踪器中写入一行,概括所选的记录。

该公式仍保留其原有作用:Ninox 使用它的最后一个值来决定谁可以读取该表。因此,请以您通常的读取条件作为结尾;像这里一样使用 true,对向所有人开放的表的读取权限没有任何改变。与 onclick 一样,该函数也是被单独从公式中提取出来的。