47 lines
1020 B
JavaScript
47 lines
1020 B
JavaScript
function observe(obj, key, watchFun, deep, page) {
|
|
let val = obj[key];
|
|
|
|
if (val != null && typeof val === "object" && deep) {
|
|
Object.keys(val).forEach((item) => {
|
|
observe(val, item, watchFun, deep, page);
|
|
});
|
|
}
|
|
|
|
Object.defineProperty(obj, key, {
|
|
configurable: true,
|
|
enumerable: true,
|
|
set: function (value) {
|
|
watchFun.call(page, value, val);
|
|
val = value;
|
|
|
|
if (deep) {
|
|
observe(obj, key, watchFun, deep, page);
|
|
}
|
|
},
|
|
get: function () {
|
|
return val;
|
|
}
|
|
});
|
|
}
|
|
|
|
export function setWatcher(page) {
|
|
let data = page.data;
|
|
let watch = page.watch;
|
|
|
|
Object.keys(watch).forEach((item) => {
|
|
let targetData = data;
|
|
let keys = item.split(".");
|
|
|
|
for (let i = 0; i < keys.length - 1; i++) {
|
|
targetData = targetData[keys[i]];
|
|
}
|
|
|
|
let targetKey = keys[keys.length - 1];
|
|
|
|
let watchFun = watch[item].handler || watch[item];
|
|
|
|
let deep = watch[item].deep;
|
|
observe(targetData, targetKey, watchFun, deep, page);
|
|
});
|
|
}
|