企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## Data组件基础04:Tree、主从数据、更新模式 **一、树型数据** 下面介绍一下Data组件的树型数据特性 Data的数据是按行(Row)存储进行存储的,当然树型数据也是按行(Row)存储,只是针对树特点在Row上增加了rows存放子行 rows : [ { rows: [...], ... },... ] **1、Data组件树相关属性** isTree : boolean 树型数据标识 treeOption :Object 树型数据相关参数 包括属性: parentRelation: 父关系,形成父子树的父关系 rootFilter: 根过滤条件,当设置时树形数据将按节点加载数据 delayLoad: 延迟数据加载,默认值为true nodeKindRelation: 节点类型关系,data操作时使用指定relation自动记录是否叶子节点信息 **2、Data组件树相关api** Data.getTreeOption();——–获取树的定义信息,返回TreeOption TreeOption包括属性: isDelayLoad 数据分级加载,进入叶子节点进行数据加载 parentRelation 父关系,形成父子树的父关系 rootFilter 根过滤条件,当设置时树形数据将按节点加载数据 nodeKindRelation 节点类型关系,data操作时使用指定relation自动记录是否叶子节点信息 可以直接修改TreeOption相关属性影响Data Data.isTree();——–判断当前data是不是tree数据,返回Boolean Data.isLeaf(Row);——–判断给定行是不是叶子节点,受TreeOption.nodeKindRelation影响,返回Boolean,参数Row为Data.Row Row.parent();——–行数据的parent对象,当是树形数据时有效 Row.children();——–获取行数据的子数据,但没有时返回undefined Row.hasChildren();——–行数据是否有子数据 Data.each(callback);Data.eachAll(callback);——–当data为tree数据时,callback遍历回调函数的参数中parent给出父Row 另外参数部分给出parent参数的函数都是支持tree数据的,即:函数执行范围在parent下,默认当没有给出parent时指tree的根数据,如: Data.loadData(data,append,parent)加载数据到parent下 Data.add(defaultValue,parent)增加数据到parent下 Data.newData(option)新增数据到option.parent下 Data.getCount(parent)获取parent下行记录数 Data.getTotal(parent)获取parent下总记录数 Data.getOffset(parent)获取parent下偏移 **3、树型加载、删除和保存** BizData树型数据加载逻辑 delayLoad=true时数据是按树型层级加载的,即data在refreshData时只是加载根数据,其他层数据通过相关树型组件(tree、treeGrid等)驱动加载或者通过data的api进行加载; 同时树根数据由rootFilter决定,缺省rootFilter=parentRelation is null;其他层级的数据在执行数据查询时自动增加parentRelation = parent.val(parentRelation)条件; 这种分级加载逻辑基本等同于普通数据加载,只是加载数据放在不同rows下; 当delayLoad=false时表示树型数据一次全部加入,返回数据同上面介绍的row—rows树型数据结构 BizData树型数据删除同普通数据删除,data组件没有提供级联删除子的能力,如果需要级联删除子可以使用biz层关系上的高级中的级联删除设置 BizData树型数据保存,首先把修改的数据行处理层二维table的结构,然后就是正常的BizData保存逻辑了 **二、主从数据** 主从数据是业务场景中经常遇到的形式,data组件默认支持了主从数据的处理; 当主数据游标滚动时会主动刺激从数据加载或者过滤,当然主从的层数没有限制,这是一个递归级联刷新刺激过程 **1、主从数据相关属性** master:{object} 主从参数 包括属性: data: 主数据的XID column: 和masterData关联的列,可以理解为数据库中的外键 autoLoad:{boolean} 自动加载数据,这个属性当data为从data时决定,是不是根据主data自动加载数据,如果从data的autoLoad=false时,从data的数据需要开发者主动调用refreshData等方法进行数据加载 **2、主从数据相关api** Data.each(callback);——-遍历当前和主关联的从数据 Data.eachAll(callback);——-遍历data的全部数据 Data.isSelfChanged();——-判断data自身是否修改 Data.isSlaveChanged();——-判断从data是否修改 Data.isChanged();——-判断data是否修改,包括从data的修改状态 **3、主从数据加载、删除和保存** 主从BizData数据加载和普通data加载逻辑基本一致,只是在从数据查询时增加了filter:master.column=masterData.getCurrentRow().getID() 同树型BizData逻辑一样,data组件没有实现前端数据的级联删除,同样需要在biz端设置整体部分关系来实现级联删除,或者通过数据库的外键特性 主从BizData数据的保存保证了事务,也就是说主从关联的所有data在一个批事务内完成,保存顺序是先主后从 **三、BizData的更新模式** 更新模式属性:BizData.updateMode 数据更新模式,取值:whereVersion/whereAll BizData更新数据的原理: 解决数据更新冲突平台采用乐观锁实现,简单说就是多个人同时更新一条数据时只会一个更新成功; 平台中更新模式有两种:whereVersion,whereAll,其实还可以增加whereKey(目前没有) whereVersion更新数据时使用key和version作为条件更新,使用data的save时平台会自动维护version,也就是说在更新语句中会做version+1,当version变化时说明数据已经被人修改,当前更新失败回滚 whereAll模式使用所有查询列的旧值做更新的条件,当条件不满足就说明数据已经被人修改,当前更新失败回滚 从数据严格性上说:whereKey<whereVersion<whereAll 平台BizData默认使用whereVersion