【语法】
一、机制原理
隐蔽的坑:界面开了两个监听挂同一个事件名,退出时一刀切全注销,另一个界面的监听也被误杀。源码 gui/SLEvent.lua 的注册带标签:注册时给事件名配一个标签,注销时同名同标签精准配对销账,别人的监听分毫不动。标签就是每份监听的身份证,成对登记成对注销,误杀从此绝迹。
二、错误写法
-- 错误:按事件名注销,别人的监听被误杀
function offAll(eventName)
listeners[eventName] = nil
end
三、正确写法
local handlers = {}
local function onEvent(key, tag, fn)
handlers[key .. "_" .. tag] = fn
end
local function offEvent(key, tag)
handlers[key .. "_" .. tag] = nil
end
onEvent("levelup", "panelA", handlerA)
offEvent("levelup", "panelA")
四、引擎验证
同名不同标签的监听互不干扰;注销只清自己的标签,其余原样保留。
五、FAQ
问:标签的作用是什么?
答:区分同事件下的不同来源,精准注销。
问:重复注册会怎样?
答:同键覆盖旧监听,天然防重。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【语法算法】 元方法 __len 的触发就这一行: 对带 __len 的表做 t 操作时,Lua 调用 __len 而不是返…
【语法算法】 load 的编译本质就这一行: load 把字符串编译成函数——字符串里的代码被编译成可调用的函数——调用返回…
【语法算法】 error 的传播本质就这一行: error 抛出一个错误——第二个参数指定错误信息的层级——层级 2 表示把…
【语法算法】 pcall 的保护调用本质就这两行: pcall 把函数包在保护壳里执行——函数内部报错不会传播到外层——ok…
【语法算法】 元方法 __tostring 的触发就这一行: 对带 __tostring 的表做 tostring(t) 或…
【语法算法】 元方法 __call 的触发就这一行: 对带 __call 元方法的表做函数调用 t(...) 时,Lua 不…