什么是DataSet?
DataSet是一个运行在客户端浏览器中的组件,本质上来说是一个JavaScript构建的对象. DataSet是一个数据容器,他封装了常用的一些数据操作,我们可以通过下面这张图来更深刻的理解DataSet的含义
通过上图我们可以看到DataSet是一个数据容器,它包含了一个数组对象用来存放所有的record对象.
Record代表一条数据对象,DataSet和Record的关系我们可以这样理解:假如我们把dataset比作数据库中的一张表, 那么record就是表中的一行记录.
在screen文件中我们通过<a:dataSet>标签来定义一个dataset对象
<a:dataSet model="sys.sys_user" id="sys_user_create_ds"> <a:fields> <a:field name="user_name" required="true"/> <a:field name="start_date" required="true" validator="dateValidator"/> <a:field name="description" required="true"/> </a:fields> <events> <a:event name="submitsuccess" handler="onCreateUserSuccess"/> <a:event name="update" handler="onUpdate"/> </events> </a:dataSet>
每一个dataset都应该定义一个id属性,在整个screen文件中不得出现重复的id值. 定义了id值我们可以在页面脚本中通过$('sys_user_create_ds')的方式 获取到这个dataset对象,进而可以调用相应的函数方法.
fields子节点定义了这个dataset都包含哪些field以及field中的特性. 在field上我们要指定它的name,通过ajax获取到的json数据会根据name来匹配. 在field上我们还可以定义一些其他的附加特性,例如是否必输,是否只读等等.
events标签定义了需要响应的事件函数,例如update事件,当dataset对其中一条record的field进行更新的时候,dataset会触发一个update事件, 这样我们可以通过配置一个客户端函数onUpdate来响应.
function onUpdate(ds,record,name,value){ if(name == 'user_password' || name == 'user_password_re'){ record.validate((name == 'user_password') ? 'user_password_re' : 'user_password'); } if(name == 'start_date' || name == 'end_date'){ record.validate((name == 'start_date') ? 'end_date' : 'start_date'); } }
更多详细配置可以参考AuroraTagDocument文档
DataSet是一个客户端的JavaScript组件,它封装了相应的ajax操作,用来和服务端进行数据交互.
客户端浏览器 服务端程序 _____________ __________________ | | | | | DataSet | | Web Server | |_____________| request |__________________| | | ------------------> | | | record | AJAX | query() | | record | <------------------ | update() | | ... | JSON | delete() | |_____________| |__________________|
DataSet是一个客户端的JavaScript组件,它封装了相应的ajax操作,用来和服务端进行数据交互.
DataSet提供了基本的数据操作,主要分为两类.一类是客户端操作,一类是和服务端通信.
客户端操作 -- 例如当调用add函数后,其实本质上是在客户端dataset中增加一条record记录,这个并没有同步到服务端数据库中.
AJAX操作 -- 通过AJAX调用和服务端进行通讯,例如query查询服务端返回相应的json数据,填充到客户端.
Metadata元数据主要用来描述field的附加特性,例如是否只读,是否必输等等.
例如:设置某一字段必输,我们可以在配置dataset的时候指定对应field的required值
<a:dataSet id="exp_employee_group_result_ds"> <a:fields> <a:field name="expense_user_group_code" required="true"/> <a:field name="description" required="true"/> </a:fields> </a:dataSet>
例如:设置某一字段只读,我们可以在配置dataset的时候指定对应field的readOnly值
<a:dataSet id="exp_employee_group_result_ds"> <a:fields> <a:field name="expense_user_group_code" readOnly="true"/> <a:field name="description" required="true"/> </a:fields> </a:dataSet>
很多情况下我们需要对dataset的值进行校验,这个时候我们可以通过在field上配置校验函数(validator)来实现
例如:我们对2个日期字段进行校验,规则是结束日期不得小于开始日期.首先我们在dataset的2个日期field上配置validator
<a:dataSet id="fnd_companies_create_ds" model="fnd.fnd_companies"> <a:fields> ... <a:field name="start_date_active" datatype="date" required="true" validator="dateValidator"/> <a:field name="end_date_active" datatype="date" validator="dateValidator"/> </a:fields> </a:dataSet>
接下来我们需要实现校验函数dateValidator
function dateValidator(record, name, value){ if(name == 'start_date_active' || name == 'end_date_active'){ var start_date = record.get('start_date_active'); var end_date = record.get('end_date_active'); if(typeof(end_date) != 'undefined' && !Ext.isEmpty(end_date)){ if(!compareDate(start_date, end_date)){ return '开始时间不能大于结束时间'; } } return true; } }
2个日期field公用了同一个校验函数,所以首先要判断name值,然后分别通过record获取对应的开始和结束日期. 如果校验成功返回true,校验失败返回提示信息.
DataSet 常用函数
Table 1. DataSet相关函数
函数 | 说明 |
---|---|
add | 在客户端dataset中新增一条record记录 |
remove | 在客户端dataset中删除指定的record |
query | 通过指定的url查询数据,服务端返回json数据填充到客户端dataset中 |
submit | 降dataset中的数据提交到指定的url中 |
DataSet 常用事件
Table 2. DataSet事件
事件名 | 说明 |
---|---|
add | 新增一条record后触发 |
remove | 删除record后触发 |
update | 当dataset中的record被更新后触发 |
load | 当dataset成功加载数据后触发 |
submit | 当dataset提交请求时触发 |
更多详细的函数请参考AuroraJavaScriptDocument