【发布时间】:2020-11-22 03:17:08
【问题描述】:
所以我希望在检测到属性更改后使用一个函数。我该怎么做
【问题讨论】:
-
请写一个代码作为例子来解释你想要什么(它可能是什么样子)。
-
本网站讨论属性访问器:lua-users.org/wiki/ObjectProperties
-
你可以复制this code,看看能走多远
所以我希望在检测到属性更改后使用一个函数。我该怎么做
【问题讨论】:
这可以使用元方法__index 和__newindex 来实现,但有一些限制。您需要使用代理表,即结果表与观察表不同,因为只有当表不包含键时才会调用元方法__newindex。
如果你需要观察嵌套表的属性,你必须创建递归代理表并动态修改它。
<script src="https://cdn.jsdelivr.net/npm/fengari-web@0.1.4/dist/fengari-web.js"></script>
<script type="application/lua">
function observable(data, callback)
return setmetatable({}, {
__index = data,
__newindex = function(self, n, v)
local oldv = data[n]
if v ~= oldv then
data[n] = v
callback(n, v, oldv)
end
end
})
end
local my_object = { test1 = 'value1' }
my_object = observable(my_object,
function(key,value,oldvalue)
print('key='..key
..', value='..tostring(value)
..', oldvalue='..tostring(oldvalue))
end)
my_object.test1 = 1
my_object.test2 = 2
my_object.test1 = 'othervalue'
my_object.test2 = nil
</script>
【讨论】: