import { ModelManager } from "./modelmanager"; import { Module } from "./module"; import { Util } from "./util"; /** * 模型类 */ export class Model { /** * model key */ public $key:number; /** * 监听器 * 存储样式{ * $this: [listener1,listener2,...],对象改变监听器,允许多个监听 * keyName: [listener1,listener2,...],属性名监听器,允许多个监听 * } */ public $watchers:any; /** * @param data 数据 * @param module 模块对象 * @returns 模型代理对象 */ constructor(data: any, module?: Module) { //模型管理器 let proxy = new Proxy(data, { set(src: any, key: string, value: any, receiver: any){ //值未变,proxy 不处理 if (src[key] === value) { return true; } //不处理原型属性 if (['__proto__'].includes(key)) { return true; } let ov = src[key]; let r = Reflect.set(src, key, value, receiver); //非对象,null,非model更新渲染 if(value && typeof value === 'object' && !value.$key){ value = new Model(value,module); } ModelManager.update(receiver, key, ov, value); return r; }, get(src: any, key: string | symbol, receiver){ let res = Reflect.get(src, key, receiver); if(res && typeof res === 'object'){ if(res.$key){ return ModelManager.getModel(res.$key); }else{ //未代理对象,需要创建模型 return new Model(res, module); } } return res; }, deleteProperty(src: any, key: any){ //如果删除对象且不为数组元素,从modelmanager中同步删除 if (src[key]&& src[key].$key && !(Array.isArray(src)&& /^\d+$/.test(key))) { ModelManager.delFromMap(src[key].$key); } delete src[key]; ModelManager.update(src,key,null,null,true); return true; } }); for(let k of ['$watch','$unwatch','$get','$set']){ proxy[k] = this[k]; } proxy.$key = Util.genId(); ModelManager.addToMap(data, proxy); //绑定到模块 if(module){ ModelManager.bindToModule(proxy,module); } if(Array.isArray(data)){ this.arrayOverload(proxy); } return proxy; } /** * 重载数组删除元素方法 * 用于处理从数组中移除的model,从modelmap移除 * @param data 数组 */ private arrayOverload(data){ data.splice = function(){ const count = arguments[1]; let r = Array.prototype['splice'].apply(data,arguments); if(count > 0){ for(let i=0;i{ for(let f of arr){ const foos = f.m.$watchers[f.k]; if(foos){ for(let i=0;i