Этого можно достичь с помощью метаметодов __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>