## 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定义计算列
- 快速入门
- 第一个应用
- WeX5产品能力和技术
- wex5技术理念
- WeX5可以怎么玩?
- WeX5和BeX5比较
- UI2开发
- UI2前端框架基础01:应用和页面
- UI2框架基础02:框架结构图和目录
- 组建基础
- 编程基础
- js引用
- css、text引用
- 设置资源依赖
- 代码调试
- 数据组件
- Data组件基础01:列、初始化加载状态、行对象和游标
- Data组件基础02:规则、数据遍历查找
- Data组件基础03:CRUD
- Data组件基础04:Tree、主从数据、更新模式
- Data组件基础05:再谈Data组件新增,查询,保存
- Data组件的JSON数据格式
- WeX5 & BeX5 页面框架核心之数据绑定
- 数据绑定属性系列
- 初识绑定
- visible绑定
- text绑定
- html绑定
- css绑定
- 页面布局
- 页面样式
- 样式基础
- 添加自定义图标(iconfont)
- 常用组件
- bar组件
- contents组件
- 前端路由和页面跳转
- 路由模块
- 页面跳转
- 部署和发布
- 三种部署方式
- Web app部署
- UIServer的缓存机制
- 自定义组件开发
- 组件运行时开发案例
- 组件设计时开发案例
- 组件设计时开发参考
- 属性编辑器配置和开发
- 自定义向导开发(waiting)
- 第三方库集成
- 集成Echarts
- 集成百度和高德地图
- App开发
- 打包
- App打包基础和常见问题
- App打包原理和目录结构
- App打包过程详解
- App打包服务器环境搭建
- 苹果证书申请 使用
- Android和IOS的本地应用图标规范
- Android和IOS的本地App如何安装(apk&ipa)
- 苹果App部署HTTPS进行在线下载安装
- 调试
- Android和IOS真机调试
- 插件
- 如何使用和扩展cordova插件
- cordova插件开发
- 常用cordovar插件
- SQLite插件
- 极光推送(JPush)插件
- 微信支付入门教程
- 微信、支付宝支付开发
- 服务端开发
- App与服务端交互原理
- 轻量级Baas(视频)(文字) (.net版)
- Data组件的JSON数据格式11
- 微信服务号集成(视频)
- 扩展学习资料
- bootstrap
- Knockoutjs
- JQuery
- requirejs
- phonegap/cordova