什么是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
Comments
2 Responses to the article