posts - 30, comments - 5, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          ExtJS Record 與 Store 說明

          Posted on 2010-05-04 11:18 無所謂 閱讀(3504) 評論(1)  編輯  收藏 所屬分類: ExtJS

          1、Record

            首先需要明確是,ExtJS中有一個名為Record的類,表格等控件中使用的數(shù)據(jù)是存放在Record對象中,一個Record可以理解為關(guān)系數(shù)據(jù)表中的一行,也可以稱為記錄。Record對象中即包含了記錄(行中各列)的定義信息(也就是該記錄包含哪些字段,每一個字段的數(shù)據(jù)類型等),同時又包含了記錄具體的數(shù)據(jù)信息(也就是各個字段的值)。

            我們來看直接使用Record的代碼:

          Ext.onReady(function(){
                   
          var MyRecord = Ext.data.Record.create([
                       {name: 'title'},
                       {name: 'username', mapping: 'author'},
                       {name: 'loginTimes', type: '
          int'},
                       {name: 'lastLoginTime', mapping: 'loginTime', type: 'date'} 
                             ]);
                   
          var r=new MyRecord({
                             title:
          "日志標(biāo)題",
                             username:
          "easyjf",
                             loginTimes:
          100,
                             loginTime:
          new Date()
                   });       
                   alert(MyRecord.getField(
          "username").mapping);
                   alert(MyRecord.getField(
          "lastLoginTime").type);
                   alert(r.data.username);
                   alert(r.get(
          "loginTimes"));
           });



             首先使用Record的create方法創(chuàng)建一個記錄集MyRecord,MyRecord其實(shí)是一個類,該類包含了記錄集的定義信息,可以通過MyRecord來創(chuàng)建包含字段值的Record對象。在上面的代碼中,最后的幾條語句用來輸出記錄集的相關(guān)信息,MyRecord.getField("username")可以得到記錄中username列的字段信息,r.get("loginTimes")可以得到記錄loginTimes字段的值,而r.data.username同樣能得到記錄集中username字段的值。
            對Record有了一定的了解,那么要操作記錄集中的數(shù)據(jù)就非常簡單了,比如r.set(name,value)可以設(shè)置記錄中某指定字段的值,r. dirty可以得到當(dāng)前記錄是否有字段的值被更改過等等。

          2Store

          Store可以理解為數(shù)據(jù)存儲器,可以理解為客戶端的小型數(shù)據(jù)表,提供緩存等功能。在ExtJS中,GridPanel、ComboBox、DataView等控件一般直接與Store打交道,直接通過store來獲得控件中需要展現(xiàn)的數(shù)據(jù)等。一個Store包含多個Record,同時Store又包含了數(shù)據(jù)來源,數(shù)據(jù)解析器等相關(guān)信息,Store通過調(diào)用具體的數(shù)據(jù)解析器(DataReader)來解析指定類型或格式的數(shù)據(jù)(DataProxy),并轉(zhuǎn)換成記錄集的形式保存在Store中,作為其它控件的數(shù)據(jù)輸入。
            數(shù)據(jù)存儲器由Ext.data.Store類定義,一個完整的數(shù)據(jù)存儲器要知道數(shù)據(jù)源(DataProxy)及數(shù)據(jù)解析方式(DataReader)才能工作,在Ext.data.Store類中數(shù)據(jù)源由proxy配置屬性定義、數(shù)據(jù)解析(讀取)器由reader配置屬性定義,一個較為按部就班創(chuàng)建Store的代碼如下:

          var MyRecord = Ext.data.Record.create([
                       {name: 'title'},
                       {name: 'username', mapping: 'author'},
                       {name: 'loginTimes', type: 'int'},
                       {name: 'lastLoginTime', mapping: 'loginTime', type: 'date'} 
                             ]);
                   var dataProxy=new Ext.data.HttpProxy({url:"link.ejf"});
                   var theReader=new Ext.data.JsonReader({
                       totalProperty: "results", 
                       root: "rows",              
                       id: "id"                   
                             },MyRecord);
                   var store=new Ext.data.Store({           
                                       proxy:dataProxy,
                                       reader:theReader
                             });
                   store.load();

            當(dāng)然,這樣的難免代碼較多,Store中本身提供了一些快捷創(chuàng)建Store的方式,比如上面的示例代碼中可以不用先創(chuàng)建一個HttpProxy,只需要在創(chuàng)建Store的時候指定一個url配置參數(shù),就會自動使用HttpProxy來加載參數(shù)。比如,上面的代碼可以簡化成:

           

          var MyRecord = Ext.data.Record.create([
                       {name: 'title'},
                       {name: 'username', mapping: 'author'},
                       {name: 'loginTimes', type: 'int'},
                       {name: 'lastLoginTime', mapping: 'loginTime', type: 'date'} 
                             ]);
                   var theReader=new Ext.data.JsonReader({
                       totalProperty: "results", 
                       root: "rows",              
                       id: "id"                   
                             },MyRecord);
                   var store=new Ext.data.Store({
                   url:"link.ejf",
                                       proxy:dataProxy,
                                       reader:theReader
                             });
                   store.load();

            雖然不再需要手動創(chuàng)建HttpProxy了,但是仍然需要創(chuàng)建DataReader等,畢竟還是復(fù)雜,ExtJS進(jìn)一步把這種常用的數(shù)據(jù)存儲器進(jìn)行了封裝,在Store類的基礎(chǔ)上提供了SimpleStore、SimpleStore、GroupingStore等,直接使用SimpleStore,則上面的代碼可以進(jìn)一步簡化成下面的內(nèi)容:

          var store=new Ext.data.JSonStore({               
                             url:"link.ejf?cmd=list",
                             totalProperty: "results", 
                             root: "rows",
                             fields:['title',   {name: 'username', mapping: 'author'},
                       {name: 'loginTimes', type: 'int'},
                       {name: 'lastLoginTime', mapping: 'loginTime', type: 'date'} 
                             ]         
                   });
                   store.load();

           

          3DataReader

          DataReader表示數(shù)據(jù)讀取器,也就是數(shù)據(jù)解析器,其負(fù)責(zé)把從服務(wù)器或者內(nèi)存數(shù)組、xml文檔中獲得的雜亂信息轉(zhuǎn)換成ExtJS中的記錄集Record數(shù)據(jù)對象,并存儲到Store里面的記錄集數(shù)組中。
            數(shù)據(jù)解析器的基類由Ext.data.DataReader定義,其它具體的數(shù)據(jù)解析器都是該類的子類,ExtJS中提供了讀取二維數(shù)組、JSon數(shù)據(jù)及Xml文檔的三種數(shù)據(jù)解析器,分別用于把內(nèi)存中的二級數(shù)組、JSON格式的數(shù)據(jù)及XML文檔信息解析成記錄集。下面簡單的介紹:
            1)ArrayReader
          Ext.data.ArrayReader-數(shù)組解析器,用于讀取二維數(shù)組中的信息,并轉(zhuǎn)換成記錄集Record對象。首先看下面的代碼:

          var MyRecord = Ext.data.Record.create([
                       {name: 'title', mapping:1},
                       {name: 'username', mapping:2},
                       {name: 'loginTimes', type:3} 
                             ]);
                   var myReader = new Ext.data.ArrayReader({
                       id: 0           
                   }, MyRecord);

            這里定義的myReader可以讀取下面的二維數(shù)組:

          [ [1, '測試', '小王',3], [2, '新年好', 'williamraym',13] ]

            2JsonReader
            Ext.data.JsonReaderJson數(shù)據(jù)解析器,用于讀取JSON格式的數(shù)據(jù)信息,并轉(zhuǎn)換成記錄集Record對象。看下面使用JsonReader的代碼:

          var MyRecord = Ext.data.Record.create([
                       {name: 'title'},
                       {name: 'username', mapping: 'author'},
                       {name: 'loginTimes', type: 'int'}
                             ]);
                   var myReader = new Ext.data.JsonReader({
                              totalProperty: "results", 
                   root: "rows",       
                    id: "id" 
                   }, MyRecord);

            這里的JsonReader可以解析下面的JSON數(shù)據(jù):

          { 'results': 2, 'rows': [
              { id: 1, title: '測試', author: '小王', loginTimes: 3 },
              { id: 2, title: 'Ben', author: 'williamraym', loginTimes:13} ]
          }

            JSonReader還有比較特殊的用法,就是可以把Store中記錄集的配置信息存放直接保存在從服務(wù)器端返回的JSON數(shù)據(jù)中,比如下面的例子:

          var myReader = new Ext.data.JsonReader();

           

            這一個不帶任何參數(shù)的myReader,可以處理從服務(wù)器端返回的下面JSON數(shù)據(jù):

          {
           'metaData': {
              totalProperty: 'results',
              root: 'rows',
              id: 'id',
              fields: [
                 {name: 'title'},
                       {name: 'username', mapping: 'author'},
                   {name: 'loginTimes', type: 'int'} ]
             },
           'results': 2, 'rows': [
              { id: 1, title: '測試', author: '小王', loginTimes: 3 },
              { id: 2, title: '新年好', author: 'williamraym', loginTimes:13}]
          }

            3)XmlReader
            Ext.data.XmlReader-XML文檔數(shù)據(jù)解析器,用于把XML文檔數(shù)據(jù)轉(zhuǎn)換成記錄集Record對象。看下面的代碼:

          var MyRecord = Ext.data.Record.create([
                       {name: 'title'},
                       {name: 'username', mapping: 'author'},
                       {name: 'loginTimes', type: 'int'}
                             ]);
                   var myReader = new Ext.data.XmlReader({
                              totalRecords: "results", 
                   record: "rows",       
                              id: "id" 
                   }, MyRecord);

            上面的myReader能夠解析下面的xml文檔信息:

          <topics>
           <results>2</results>
           <row>
             <id>1</id>
             <title>
          測試</ title >
             <author>小王
          </ author >
           <loginTimes>3</ loginTimes >
           </row>
           <row>
             <id>2</id>
             <title>新年好
          </ title >
             <author> williamraym </ author >
           <loginTimes>13</ loginTimes >
           </row>
          </topics>

          評論

          # re: ExtJS Record 與 Store 說明  回復(fù)  更多評論   

          2013-01-23 09:33 by lovingshu
          除了代碼格式和縮進(jìn)需要調(diào)一下,其余的都不錯!
          主站蜘蛛池模板: 达州市| 中山市| 安阳县| 唐河县| 冀州市| 东宁县| 元氏县| 尚义县| 南昌市| 清流县| 韩城市| 赤水市| 丹棱县| 临朐县| 和林格尔县| 都昌县| 旌德县| 滁州市| 靖州| 石嘴山市| 凭祥市| 宁河县| 思南县| 康平县| 墨竹工卡县| 沈阳市| 蕉岭县| 怀安县| 资兴市| 城口县| 苏尼特左旗| 凤山县| 岗巴县| 太康县| 乌鲁木齐县| 凤城市| 文安县| 香河县| 新宾| 巴楚县| 白玉县|