functionnewProxy(model) local t = {} local raw = {} iftype(model) ~= "table"then return model end for k, v inpairs(model) do raw[k] = newProxy(v) end setmetatable(t, { __index = function(t, key) print("get key " .. key) return raw[key] end, __newindex = function(t, key, value) local oldValue = raw[key] print("set key:" .. key) raw[key] = newProxy(value) end, __len = function() return #raw end }) return t end
local createTrack = function(effects) local dep = new end
Dep.__index = Dep
functionDep.Dep() local t = setmetatable({}, Dep) t.listeners = {} return t end
functionDep:addWatcher(watcher) table.insert(self.listeners, watcher) end
functionDep:removeWatcher(watcher) local index = nil for k,v inpairs(self.listeners) do if v == watcher then index = v break end end table.remove(table, index) end
functionDep:notify(newValue, oldValue) for _, v inipairs(self.listeners) do v(newValue, oldValue) end end Dep.Target = nil
local Dep = require("Dep") -- 测试代码 functiondumpTable(t) local res = "" if t == nilthen return"nil" end iftype(t) == "table"then for k, v inpairs(t) do res = res.."\n"..k..":"..dumpTable(v) end else res = res..tostring(t) end return res end
functionnewProxy(model) local t = {} local raw = {} -- 捕获的依赖关系 local dep = Dep.Dep() iftype(model) ~= "table"then return model end for k, v inpairs(model) do raw[k] = newProxy(v) end setmetatable(t, { __index = function(t, key) -- watch if Dep.Target then print("add watcher "..key) dep:addWatcher(Dep.Target) end return raw[key] end, __newindex = function(t, key, value) local oldValue = raw[key] dep:notify(value, oldValue) print("key:"..key) print("value:"..dumpTable(value)) print("oldValue:"..dumpTable(oldValue)) raw[key] = newProxy(value) end }) return t end
localfunctiondoWatch(effect, callback) Dep.Target = callback effect() Dep.Target = nil end