• Ext.data库中几个常用类的原理及其使用 (转)


    由于公司需要使用Extjs来做一个项目,所以花点时间研究了一下Ext。

    该项目基于.net2.0+Extjs来实现,具体的架构以后会慢慢贴出,这里只是简单介绍一下Ext.data库中几个常用的类的实现原理和使用.

    Ext.data 库主要包括以下几个类:

    Ext.data.Store ==>DataSet

    Ext.data.Record ==>DataSet.Row

    Ext.data.DataProxy ==>SqlConnection

    Ext.data.DataReader ==>SqlDataAdapter

    以下分别进行介绍:

    1.Ext.data.Record

    可以用来定义一行数据的格式,它有几个重要的属性和方法:

    data:实际的数据

    modified:如果dirty==true 这modified中存放的是修改前的数据否则为空

    e.g:

         if(dirty){var a = modified['Name']};

    构造函数:

    RecordArray data, [Object id] )

    e.g:

    var a = new Ext.data.Record([

    {name:'Name'},

    {name:'Address'}

    ],{id:'Name'}) ;

    其中第2个参数可以不写

    等价于

    var a = Ext.data.Record.create([

    {name:'Name'},

    {name:'Address'}

    ],{id:'Name'}) ;

    生成一行实际数据

    var record = new a({

    Name:'test',

    Address:'where'

    });

    Ext.Msg.alert('test',record.get('Name')) 输出:'test'

    Ext.Msg.alert('test',record.data.Name)输出:'test'

    定义好行的格式之后我们就可以生成DataProxy去获取数据

    DataProxy 分为3种,我们主要使用其中的2种MemoryProxy 和HttpProxy,其中最重要的方法:

    loadObject params, Ext.data.DataReader reader, Function callback, Object scope, Object arg ) : void

    MemoryProxyObject data )

    e.g:

    MemoryProxy只可以识别数据对象的数据格式如下:

    var data = [['tt','shenzhen'],['tt2','shenzhen']];

    定义reader 可以又多种方法:

    1.var reader = new Ext.data.ArrayReader({id:'Name'},r);

    2.var reader = new Ext.data.ArrayReader({id:'Name',fields:['Name','Address']});

    一般使用第2种方法,因为代码量少

    DataReader ,ArrayReader ,JsonReader 的继承关系如下:
    JsonReader 继承DataReader ,ArrayReader 继承JsonReader ,ArrayReader 于JsonReader 唯一的区别就是readRecords方法的实现不一样;

    下面就着源码讲解一下为什么DataReader 可以用多种方法去生成

    DataReader:

    Ext.data.DataReader = function(meta, recordType){
        /**
         * This DataReader's configured metadata as passed to the constructor.
         * @type Mixed
         * @property meta
         */
        this.meta = meta;
        this.recordType = Ext.isArray(recordType) ?
            Ext.data.Record.create(recordType) : recordType;
    };

    ---------------------------------------------------------

     JsonReader:

    Ext.data.JsonReader = function(meta, recordType){
        meta = meta || {};
        Ext.data.JsonReader.superclass.constructor.call(this, meta, recordType || meta.fields);
    };

    JsonReader 的构造函数中调用了DataReader的构造函数就是我用黄颜色标记的地方,如果JsonReader 的Config对象中提供了fields属性则调用的方法如下:

    DataReader(meta,meta.fields);

    否则就只能只用使用原来Ext.data.Record.create()生成的对象去初始化DataReader(meta,r.prototype.fields);

    var proxy = new Ext.data.MemoryProxy(data);

    proxy.load(null,reader,callback,this,{req:'123'});

    function callback(Records,arg,bFlag){alert(Records.records[0].get('Name'))} 输出:'tt';

    proxy的load 方法中调用了reader.readerRecords(data)来读取数据 结果就是callback函数中的Records{records:[],recordsCount}:records为读出的数据的数据对象,recordsCount表示记录的行数;

    当然也可以生成一个JsonReader 对象来读取数据

    e.g:

     var jsonReader = new Ext.data.JsonReader({
       id:'Name',
       root:'data',
       totalProperty:'totalCount',
       fields:['Name','Address']
        });

     var jsonData = {
                      'totalCount':2,
                      'data':[
                                 {'Name':'tt','Address':'shenzhen'},
                                 {'Name':'tt1','Address':'shenzhen'}
                                ]
        };

     var proxy = new Ext.data.MemoryProxy(jsonData);

     proxy.load(null,reader,callback,this,{req:'123'});

     function callback(Records,arg,bFlag){alert(Records.records[0].get('Name'))} 输出:'tt';

     Ext.data库中最重要的就是Ext.data.Store ,它可以为Ext.grid.GridPanel ,Ext.form.Combox ...提供数据源

     有2种Store都继承自Ext.data.Store:Ext.data.JsonStore 和Ext.data.SimpleStore

    Ext.data.JsonReader 对应 Ext.data.JsonReader ;Ext.data.SimpleStore 对应 Ext.data.ArrayReader

    Ext.data.Store的主要Config属性有:

    url:请求数据的Url地址;

    data:直接提供的数据源;

    proxy:Ext.data.DataProxy(从哪里取数据);

    reader:Ext.data.DataReader(取什么样的数据);

    baseParams:请求时要附加的参数:{req:'123'};

    以上的配置属性之间有一些联系,主要表现在url和proxy上面

    现在讲解一下store中各个对象的生成关系和顺序:

    1.初始化baseParams:{start:,limit:sort:dir:}
    2.判断有没有直接传入数据集合==>config.data==null ;this.inlineData = data;
    3.config.url !=null 同时config.proxy没有数值
           就用config 的url直接生成一个this.proxy=HttpProxy();
           this.proxy在后面的load()函数中会使用到,这就是为什么有时我们在配置store的时候提供了config.data 和config.reader,而没有提供config.proxy就会报错的原因
           因为在load()函数中会调用Ext.data.DataProxy.load()方法

    4.判断是否提供了config.reader,生成this.recordType 和this.fields

    JsonStore 的构造函数源码如下:

    Ext.data.JsonStore = function(c){
        /**
         * @cfg {Ext.data.DataReader} reader @hide
         */
        /**
         * @cfg {Ext.data.DataProxy} proxy @hide
         */
        Ext.data.JsonStore.superclass.constructor.call(this, Ext.apply(c, {
            proxy: c.proxy || (!c.data ? new Ext.data.HttpProxy({url: c.url}) : undefined),
            reader: new Ext.data.JsonReader(c, c.fields)
        }));
    };

    生成原理:

    1.调用Ext.data.Store的构造函数,其中我标为黄色的语句表达的意思就是:如果提供了proxy配置属性就使用当前配置的Proxy去获取数据,没有提供则判断是否有直接数据源提供,没有则用

    url配置属性去生成一个HttpProxy去获取数据,绿色语句是生成Ext.data.DataReader对象,在Store 的Load()方法会使用他去读取数据;

    在这里顺便介绍一下在源码中使用最多的一种语句 (c = a||b )== (c=a==undefinde ? b:a)

    ---------------------------------------------------------------------

    SimpleStore 的构造函数源码如下:

    Ext.data.SimpleStore = function(config){
        Ext.data.SimpleStore.superclass.constructor.call(this, Ext.apply(config, {
            reader: new Ext.data.ArrayReader({
                    id: config.id
                },
                Ext.data.Record.create(config.fields)

            )
        }));
    };

    SimpleStore的生成原理与JsonStore大体一致,

    在以上的2段代码中都要注意到的是config.fields配置属性,他们都被用来去生成Ext.data.Record对象;

    现在举几个生成Store对象的例子

    1.

         var data =[['tt','shenzhen'],['tt2','shenzhen']];

         var store = new Ext.data.SimpleStore({

                  data:data,

                  fields:['Name','Address']

         });

    2.

         var jsonData = {
                      'totalCount':2,
                      'data':[
                                 {'Name':'tt','Address':'shenzhen'},
                                 {'Name':'tt1','Address':'shenzhen'}
                                ]
        };

        var store = new Ext.data.JsonStore({

                  data:jsonData ,

                  fields:['Name','Address'],

                  id:'Name',

                  root:'data',

                  totalProperty:'totalCount'  

         });

    3.

        var store = new Ext.data.JsonStore({

                  URL:

                  fields:['Name','Address'],

                  id:'Name',

                  root:'data',

                  totalProperty:'totalCount'  

         });

    其中以第3中方法使用最为广泛.

  • 相关阅读:
    MySQL学习笔记:repeat、loop循环
    链表//相交链表
    单位和值
    链表//环形链表 II
    css样式设置小技巧
    链表//环形链表
    CSS代码缩写,占用更少的带宽
    CSS布局模型
    CSS盒模型
    CSS格式化排版
  • 原文地址:https://www.cnblogs.com/luluping/p/1539884.html
Copyright © 2020-2023  润新知