ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## Data组件基础03:CRUD **一、新增** **1、Data组件的新增相关API:** Data.newData(option);——–后端新增,返回一行或者多行新增数据 option参数说明: { "parent" : Data.Row - 树形数据的父(非树形不需要), "index" : integer - 新增数据的位置,缺省新增到最后, "defaultValues" : array - 新增行的默认值数组 ,数组的长度决定新增行数,数组中的对象是列的默认值 defaultValues格式: [ {列名:默认值,...}, {列名:默认值,...}, ... ] "onError" : function - 失败回调函数,function(event); event的格式: { "source" : {Data} - 组件的js对象, "errorType" : {string} - 'server', "errorNode" : {object} - 错误信息, "httpError" : {boolean} - 是否http请求失败, "httpState" : {string} - http请求返回码 } "onSuccess" : function - 成功回调函数,function(event); event的格式: { "source" : {Data} - 组件的js对象, "rows" : {List} - 新增行的数组 } } Data.add(defaultValues,parent);——–前端新增一行数据,状态需要开发者设定,defaultValues,parent参数同上;不会触发data相关事件 **2、新增数据相关事件:** onBeforeNew(event)——-新增前,可以通过event.cancel=true终止新增动作 event说明: { "source" : 组件的js对象, "options" : 新增时传入的option参数,包括:parent,defaultValues "cancel" : 可修改,设置为true后中断当前new动作 } onCustomNew(event);——业务数据新增接管,完全接管new动作,需要接管此事件完成data的newData逻辑 event说明: { "source" : 组件的js对象, "options" : 新增时传入的option参数,包括:parent,defaultValues "data" : 行数据对象数组即返回的新增数据,数组的length决定新增的行数 data格式: [ { "列名" : 默认值, "列名" : 默认值, ... }, ... ] } onAfterNew(event);——业务数据新增后 event说明: { "source" : 组件的js对象, "options" : 新增时传入的option参数,包括:parent,defaultValues "rows" : {List} 新增的行数组 } onDataChange(event);——Data数据状态变化事件,新增后会触发 event说明: { "source" : 组件的js对象, "options" : 新增时传入的option参数,包括:parent,defaultValues "rows" : {List} 新增的行数组 "type" : "new" } onNewCreateParam(event);—–BizData事件,业务新增数据创建新增参数事件,可以增加和修改用户自定义的参数 event说明: { "source" : 组件的js对象, "param" : {Request.ActionParam} 新增参数对象, "table" : {List[Data.Row]} 新增行的默认值数组 ,数组的长度决定新增行数,数组中的对象是列的默认值 "options" {Object} 新增传入的参数,如果是tree时可以使用options.parent获取父行对象 "defaultValues" : {Object} - 新增行的默认值表达式字符串,支持使用Biz的fn函数,如果fName默认值是'abc'那么正确写法是defaultValues['fName']=justep.Util.toExprString('string','abc'),当table上没有给出默认值时使用此默认值表达式,建议简单默认值尽量使用table参数 defaultValues格式:{列名:默认值表达式,...} } onNewError(event);———–BizData事件,新增失败后事件 event说明: { "source" : 组件的js对象, "errorType" : 'server', "errorNode" : 错误信息, "httpError" : http请求失败(true/false), "httpState" : http请求返回码 } **3、BizData组件newData和BizServer createAction的关系** BizData组件是针对BizServer action扩展的Data组件,BizData组件理解BizServer的createAction,onNewCreateParam事件是BizData组件创建准备createAction参数的事件,当扩展了createAction可以通过这个事件进行参数赋值和修改; 下面重点讲一讲BizData新增默认值; 在BizModel中可以看到createAction有两个public参数table和defaultValues,table默认值优先级高于defaultValues,也就是说当table中的列没有赋值时才使用defaultValues默认值;除了action层面的默认值还有概念关系上的默认值,当createAction没有table和defaultValues默认值时使用概念关系上的默认值,那么整个Biz端新增默认值的优先级就是: table > defaultValues > 概念上关系默认值 > 关系默认值 有了上面的认识对于BizData的新增默认值就好理解了,首先onNewCreateParam事件中table和defaultValues对应的就是createAction的参数table和defaultValues,默认值优先级就显而易见了,到这大家可能会问,newData中option参数上的defaultValues和这些默认值又是什么关系?newData中option参数上的defaultValues最终对应的是onNewCreateParam事件中table参数,也就是说newData中option参数上的defaultValues优先级最高 下面给出BizData新增的代码示例: //新增两行数据到最后,并且给出sName和sCode的默认值 var data = this.comp('mainData'); var options = { defaultValues : [ {sName:'a1',sCode:'b1'}, {sName:'a2',sCode:'b2'} ] }; data.newData(options); //使用add新增 var row = data.add({sName:'a1',sCode:'b1'}); data.setRowState(row, Data.STATE.NEW);//设置新增行状态 **二、刷新** **1、Data组件数据刷新加载API** Data.refreshData(option)—-业务数据刷新,会刺激从data级联刷新,当limit!=-1时取第一页数据,当limit=-1时取全部数据,当confirmRefresh=true并且数据是编辑或者新增状态时刷新数据时显示刷新确认提示框 option参数说明: { "onError" : {function} - 失败回调,function(event), event的格式: { "source" : {Data} - 组件的js对象, "errorType" : {string} - 'server', "errorNode" : {object} - 错误信息, "httpError" : {boolean} - 是否http请求失败, "httpState" : {string} - http请求返回码 } "onSuccess" : {function} - 成功回调,function(event), event的格式: { "source" : {Data} - 组件的js对象 } } Data.open()—-加载数据行为和refreshData一致,只是当Data.isLoaded()==false时执行数据加载 Data.loadNextPageData(option)—-加载下一页的数据,limit!=-1时可以使用 option参数同Data.refreshData(option)option参数 Data.loadAllPageData(option)—-在分页状态加载所有数据,limit!=-1时可以使用 option参数同Data.refreshData(option)option参数 Data.loadPageData(pageIndex,option)—-分页模式下加载第N页数据,参数pageIndex指定需要加载的页,limit!=-1时可以使用 option参数同Data.refreshData(option)option参数 Data.loadData(data,append,parent,index)—-加载数据到Data data:{Json Object} 必须参数,需要加载的Json数据,格式同biz层序列化格式,即包含rows数组的数据 append:{Boolean} 数据增加模式 true/false parent:{Data.Row} 树形数据时增加数据的父,为null时数据加载到根下 index:{Integer} 加载数据的插入位置,缺省数据插入到末尾 //通过loadData给data增量载入数据 var data = this.comp('mainData'); data.loadData({ rows:[ {fName:'小李',fAge:25}, {fName:'小王',fAge:28}, {fName:'小张',fAge:20} ] },true); 和刷新数据相关还有两个属性:confirmRefresh、confirmRefreshText,当confirmRefresh==true并且data处于修改状态时刷新data将弹出confirmRefreshText提示,取消后将不进行刷新动作 **2、Data组件数据刷新相关事件** onBeforeRefresh(event)——-刷新前,可以通过event.cancel=true终止刷新动作 event说明: { "source" : 组件的js对象, "options" : 刷新给入的参数 "cancel" : 可修改,设置为true后中断当前刷新动作 } onCustomRefresh(event)——-业务数据刷新接管,完全接管刷新动作 event说明: { "source" : 组件的js对象, "cancel" : 可修改,设置为true后中断当前刷新动作, "limit" : 页大小, "offset" : 偏移, "options" : 刷新给入的参数 } onAfterRefresh(event)——-业务数据刷新后 event说明: { "source" : 组件的js对象 "limit" : 页大小, "offset" : 偏移, "options" : 刷新给入的参数 "success" : 是否成功刷新 } onDataChange(event);——Data数据状态变化事件,刷新后会触发 event说明: { "source" : 组件的js对象 "limit" : 页大小, "offset" : 偏移, "options" : 刷新给入的参数 "success" : 是否成功刷新 } onRefreshCreateParam(event)——-BizData事件,业务刷新数据创建刷新参数事件,可以增加和修改用户自定义的参数 event说明: { "source" : 组件的js对象, "limit" : 页大小, "offset" : 偏移, "options" : 刷新给入的参数 "success" : 是否成功刷新 "type" : "refresh" } onRefreshError(event)——-BizData事件,业务刷新数据失败后事件 event说明: { "source" : 组件的js对象, "options" {Object} 新增传入的参数,如果是tree时可以使用options.parent获取父行对象 "param" : {Request.ActionParam} 刷新参数对象 "offset" : 取数据的偏移 "limit" : 取数据的条数 } **3、BizData组件数据刷新和BizServer queryAction的关系** 同样BizData组件理解BizServer的queryAction,BizData组件的数据刷新是通过BizServer的queryAction返回数据的,onRefreshCreateParam事件同样可以用于适配不同的queryAction进行参数的增减,在Data组件上offset、limit属性有着比较重要的地位,这两个参数直接对应后台的queryAction的offset、limit参数,limit指一页数据取多少条,offset指从第几条开始取数据,所有的刷新数据API都和offset、limit属性有关,使用分页相关刷新API时,limit必须大于0。(这里简单提一下Data组件,Data组件虽然没有实现后端取数据逻辑,但是通过onCustomRefresh事件能同样实现对应queryAction的数据查询) **三、保存** **1、Data组件数据保存API** Data.saveData(option)——-业务数据保存方法,向后端提交修改的数据,包括从Data数据 option参数说明: { "onError" : {function} - 失败回调,function(event), event的格式: { "source" : {Data} - 组件的js对象, "errorType" : {string} - 'server', "errorNode" : {object} - 错误信息, "httpError" : {boolean} - 是否http请求失败, "httpState" : {string} - http请求返回码 } "onSuccess" : {function} - 成功回调,function(event), event的格式: { "source" : {XData} - 组件的js对象 } "ignoreInvalid" : {boolean} - 保存时忽略有效性校验,默认false } **2、Data组件数据保存事件** onBeforeSave(event)——-业务数据保存前,事件在批事务启动后触发,写在这个事件里的biz action请求将在一个批操作完成 event说明: { "source" : 组件的js对象, "cancel" : 可修改,设置为true后中断当前保存动作 } onCustomSave(event)——-业务数据保存接管,完全接管保存动作 event说明: { "source" : 组件的js对象, "cancel" : 可修改,设置为true后中断当前保存动作 "options" : 保存时给入的参数 } onAfterSave(event)——-业务数据保存后,事件在批事务启动后触发,写在这个事件里的biz action请求将在一个批操作完成 event说明: { "source":组件的js对象, "cancel" : 可修改,设置为true后可中断当前批操作中的所有保存 "options" : 保存时给入的参数 } onSaveCommit(event)——-业务数据保存事务提交后,数据提交成功,BizData组件是BizServer保存成功后触发,Data组件是开发者保存提交成功后通过API Data.applyUpdates()刺激触发 event说明: { "source" : 组件的js对象 } onSaveCreateParam(event)——-BizData事件,业务数据保存创建保存参数事件,可以增加和修改用户自定义的参数 event说明: { "source" : 组件的js对象, "param" : {Request.ActionParam} 保存参数对象 } onSaveError(event)——-BizData事件,业务保存失败后事件 event说明: { "source" : 组件的js对象, "errorType" : 'server', "errorNode" : 错误信息, "httpError" : http请求失败(true/false), "httpState" : http请求返回码 } **3、BizData组件数据保存** BizData组件数据保存时主从所有的data在一个批事务请求中,提交到BizServer saveAction保存的数据只包含修改的数据(新增、删除,修改),saveAction成功返回后会主动调用Data.applyUpdates()进行数据状态的修改,当然同样规则可以通过onSaveCreateParam事件进行saveAction的扩展。 BizData保存更新模式属性updateMode,它定义了BizData数据的更新模式,下面结合此属性讲讲基于BizData的数据保存原理, 解决数据更新冲突平台采用乐观锁实现,简单说就是多个人同时更新一条数据时只会一个更新成功;平台中更新模式有两种:whereVersion,whereAll,其实还可以增加whereKey(目前没有实现),whereVersion更新数据时使用key和version作为条件更新,使用data的save时平台会自动维护version,也就是说在更新语句中会做version+1,当version变化时说明数据已经被人修改,当前更新失败回滚,whereAll模式使用所有查询列的旧值做更新的条件,当条件不满足就说明数据已经被人修改,当前更新失败回滚。从数据严格性上说:whereKey<whereVersion<whereAll,平台BizData默认使用whereVersion **四、删除** Data组件删除根据directDeleteMode属性分为立即删除和跟随saveData删除,directDeleteMode==true时BizData直接请求BizServer saveAction进行数据删除,directDeleteMode!=true时deleteData只是把数据放入data的删除队列,直到saveData时才一起提交所有修改数据,也就是说BizData组件的删除都是使用BizServer saveAction实现。 **1、Data组件删除API** Data.deleteData(rows) Data.deleteAllData() **2、Data组件删除事件** onBeforeDelete(event)——-业务数据删除前 event说明: { "source" : 组件的js对象, "cancel" : 可修改,设置为true后中断当前delete动作, "deleteRows" : 删除的行数组 } onCustomDelete(event)——-业务数据删除接管,完全接管delete动作 event说明: { "source" : 组件的js对象, "cancel" : 可修改,设置为true后中断当前delete动作, "deleteRows" : 删除的行数组 } onAfterDelete(event)——-业务数据删除后 event说明: { "source" : 组件的js对象, "deleteRows" : 删除的行数组 } onDeleteError(event)——-BizData组件事件,删除提交失败后事件 event说明: { "source" : 组件的js对象, "errorType" : 'server', "errorNode" : 错误信息, "httpError" : http请求失败(true/false), "httpState" : http请求返回码 } **五、数据状态** Data组件的数据状态包括data状态、Row状态、Cell状态; data状态指Data数据是否加载数据,通过Data.isLoaded()获取,这个状态在Data.refreshData、Data.newData等加载数据API执行后状态变更成true; Row状态指行数据状态,包含:Data.STATE.NEW、Data.STATE.DELETE、Data.STATE.EDIT、Data.STATE.NONE,数据新增、删除、修改后行状态变更,然后在执行Data.saveData后通过Data.applyUpdates()更新行状态为Data.STATE.NONE(BizData会自动调用Data.applyUpdates()); Cell状态指列上的修改状态,当数据修改后列上changed变更为true,同Row的状态逻辑Data.saveData后变更为false; 相关API: Data.getRowState(row)—-获取行状态,参数row给出要获取状态的行对象 Data.setRowState(row,state)—-修改行状态,row:行对象,state:行状态,注:不能设置delete状态,使用deleteData函数实现 Data.isChanged()—-判断是否有数据修改 **六、数据序列化** 把Data的数据进行序列化提供了API: Data.toJson(changed,excludeCalculateCol)——-data的json格式序列化对象,changed参数=true,只序列化data的变化行数据,excludeCalculateCol参数=true,排除data定义计算列