DataSet

什么是DataSet?

DataSet是一个运行在客户端浏览器中的组件,本质上来说是一个JavaScript构建的对象. DataSet是一个数据容器,他封装了常用的一些数据操作,我们可以通过下面这张图来更深刻的理解DataSet的含义

通过上图我们可以看到DataSet是一个数据容器,它包含了一个数组对象用来存放所有的record对象.

Record代表一条数据对象,DataSet和Record的关系我们可以这样理解:假如我们把dataset比作数据库中的一张表, 那么record就是表中的一行记录.

DataSet定义

在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)

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>
                

校验(Validate)

很多情况下我们需要对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常用操作与事件

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