跳到主要内容

事件与命令

界面上的交互分两条路径:按钮事件(前端 → Lua)和命令(Lua → 前端)。 本页说明如何用 PushCommand 把结果推送给界面。

按钮事件:前端 → Lua​

按钮 schema 中的 event 与 click 定义了一个事件。点击时前端会发起 callUIEvent, 框架找到同名事件并执行 click(form):

{ type = "button", label = "记录当前位置", event = "record",
click = function(form)
local pos = hmPlayer.getCurrentPosition()
GoPrint("当前位置", pos.x, pos.y)
end,
}

click 在界面环境中执行,可用 PushCommand、AddTask、RemoveTask、DoLuaString 等。

命令:Lua → 前端​

PushCommand(target, command, args)
参数类型说明
targetstring | nil目标组件的 field;全局命令传 nil
commandstring命令名
argsany命令参数

命令会作为 pushCommand 事件发送给前端,由对应组件处理。

内置命令​

openForm —— 打开子表单​

全局命令,target 传 nil。前端会弹出子表单对话框。

参数类型说明
formNamestring要打开的表单名(RegisterForm 注册的名字)
titlestring弹窗标题(可选)
userArgstable透传给子表单 submitForm 的参数(可选)
PushCommand(nil, "openForm", {
formName = "selectUseItem",
title = "选择物品",
userArgs = { source = "main" },
})

addItems —— 向 list 添加条目​

target 为 list 组件的 field。args 可以是单个对象或对象数组。

-- 追加一条
PushCommand("points", "addItems", {
label = "洛阳(100,200)",
x = 100, y = 200,
})

-- 追加多条
PushCommand("useItems", "addItems", {
{ label = "金创药" },
{ label = "还魂丹" },
})

显示时默认取每行的 label 字段(可用 titleKey 改为其它键)。

addRow —— 向 tableData 添加一行​

target 为 tableData 组件的 field,args 是一个行对象,键需与 columns 的 key 对应。

PushCommand("rows", "addRow", {
name = "猫眼石",
count = 3,
})

日志输出​

若只是想输出信息,用 GoPrint 即可,它会同时写入服务器日志与前端日志面板:

GoPrint("已添加", #items, "个物品")

前端组件与命令的对应关系​

命令处理者触发方式
openForm任务面板打开子表单弹窗
addItemslist 组件target 等于该组件的 field
addRowtableData 组件target 等于该组件的 field

收到命令后,前端会更新表单值并自动刷新 schema,因此列表/表格内容会立即变化。

备注

target 与 command 需与组件匹配:例如 addItems 的 target 必须是某个 list 的 field, 否则命令会被忽略。

下一步:发布与安装。