ExtJs開發教程_001_Ext.data.Store使用方法詳解


本系列教程基本可以看做是ExtJS API中文版+實例演示

Ext.data.Store 用法介紹

這個組件繼承自Ext.data.AbstractStore

 本篇講解了如何構造並且做一些基本使用,如果有什么疑問可以聯系我QQ1330771552

下面是他的屬性列表

autoLoad  //是否自動加載
autoSync //是否自動同步
buffered //允許緩沖(官方有個5000條數據的例子可以參看)
clearOnPageLoad //是否在加載新數據的時候清空舊數據
clearRemovedOnLoad//加載的時候把刪除掉的數據徹底刪除(所謂刪除掉的數據是指store.remove())
data//數據
fields//解析數據的字段
filters//過濾器(可以參看Ext.util.Filter和Ext.ux.grid.filter.Filter)
groupDir
groupField//用哪一個字段分組
leadingBufferZone//緩沖的情況下,最多緩沖多少行
listeners//監聽器,可以指定各種on事件
model//解析數據的模型,模型可以代替proxy和fields配置
pageSize//每頁顯示多少條數據
proxy//數據代理(其實就是發送ajax來請求數據用的)
purgePageCount//多少頁清除一次緩存數據(具體是和緩沖結合使用,本文不介紹緩沖)
remoteFilter//這個屬性會往服務器發送過濾條件
remoteGroup//往服務器發送分組條件(同上,做法就是表單參數提交到后台)
remoteSort//往后台發送排序條件
sortOnFilter//排序的時候進行過濾
storeId//唯一標示,讓Ext.data.StoreManager來管理用的
trailingBufferZone//緩沖多少條

  

// 本頁的全局pageSize
var PAGESIZE = 20;

var demoStore = Ext.create('Ext.data.Store', {
           // fields一定要明確指定type,這樣有很多好處,比如filter能直接設為true,便會默認按照store-fields設置好的type來確定filter的類型。
           fields : [{
                     name : 'primaryKey',
                     type : 'int'
                  },{
                     name : 'price',
                     type : 'float'
                  }, {
                     name : 'productName',
                     type : 'string'
                  }, {
                     name : 'title',
                     type : 'string'
                  }, {
                     name : 'buyDate',
                     type : 'date',
                     dateFormat : 'Y-m-d'// 此處可以避免IE下日期出現錯誤nan
                  }],
           // 數據代理服務
           proxy : {
              type : 'ajax',// 使用ajax請求
               url :'/read/demo/product.action',// 請求后台讀取數據的地址
              // 讀取數據的工具(數據代理)
              reader : {
                  // 讀取方式按照json字符串格式讀取
                  type : 'json',
                  // json解析成js對象之后讀取所有數據(通常是數組)的屬性名稱。
                  root : 'root',
                  // json解析成js對象之后讀取數據總條數的屬性名稱
                  totalProperty : 'totalProperty'
              }
           },
           // 自動加載
           autoLoad : true,
           // 每頁顯示多少條
           pageSize : PAGESIZE
       });
 
 
 
// 商品grid
       Var demoGrid = Ext.create('Ext.grid.Panel', {
                  // 不要邊框能好看一些
                  border : false,
//用來進行選擇的選擇器
                  selModel : Ext.create('Ext.selection.CheckboxModel'),
                  // 所使用的數據源
                  store : renYuanStore,
                  // 創建列詳細可以參看renYuanColumns函數
                  columns : renYuanColumns(),
                  // 需要分頁、全顯示按鈕
                  pageChange : true,
                  // 底部toolbar,不需要進行后處理。所以使用“匿名類”
                  bbar : [{
                            // 控件類型pagingtoolbar
                            xtype : 'pagingtoolbar',
                            // 這個屬性好像在extAPI中沒寫,但是不寫還不行。能控制ProgressBarPager。不然ProgressBarPager會出bug
                            pageSize : PAGESIZE,
                            // 所使用的數據源
                            store : renYuanStore,
                            // 因為Ext.ux.LiveSearchGridPanel默認把tbar和bbar占用了。所以只能使用dockedItems添加toolbar
                            dock : 'bottom',
                            // 插件,使用ProgressBarPager插件,顯示進度條
                            plugins : Ext.create('Ext.ux.ProgressBarPager')
                         }],
                  // 添加雙擊編輯事件監聽器
                  listeners : {
                     itemdblclick : function() {
// editBtn是編輯按鈕。此處做法目的是雙擊數據進行編輯
                         editBtn.handler();
                     }
                  }
              });

 

該組件相當於一個數據源,能夠給很多呈現數據的組件提供數據。

核心工作過程是:

首先請求后台讀取數據,接受后台返回的數據(其實就是個字符串)

然后按照指定格式解析數據。通常默認格式為json

我們可以自定義解析規則。詳細參看Ext.data.reader.Reader

最后把解析好的數據轉換成Ext.data.Model實例

我們可以自定義模型。

Ext.define('User', {
    extend: 'Ext.data.Model',
    fields: [
        {name: 'name',  type: 'string'},
        {name: 'age',   type: 'int', convert: null},
        {name: 'phone', type: 'string'},
        {name: 'alive', type: 'boolean', defaultValue: true, convert: null}
    ],
 
    changeName: function() {
        var oldName = this.get('name'),
            newName = oldName + " The Barbarian";
 
        this.set('name', newName);
    }
});

  

 

通常重復打開定義了Ext.data.Model的頁面(就是加載js)會出現一個錯誤,大致意思是說,重復定義某個類了。

我們可以這樣避免這個問題

Var exitModel=Ext.ModelManager.get(‘modelId’)//此處modelId是你自己給自己定義的model指定的ID。('User')
//如果不知道exitModel是什么類型,為什么可以直接取反,請參看js基礎(js中 nan,undifined,null,0,‘’都是互通的)
If(!exitModel){ 
  //TODO 在這里定義你的model 
}

  

自定義模型之后就可以使用該模型來構造store

改寫上面的store

Ext.define('ProductModel', {
     extend: 'Ext.data.Model',
     fields: [{
                     name : 'primaryKey',
                     type : 'int'
                  },{
                     name : 'price',
                     type : 'float'
                  }, {
                     name : 'productName',
                     type : 'string'
                  }, {
                     name : 'title',
                     type : 'string'
                  }, {
                     name : 'buyDate',
                     type : 'date',
                     dateFormat : 'Y-m-d'// 此處可以避免IE下日期出現錯誤nan
                  }]
 });
 
 var demoStore = Ext.create('Ext.data.Store', {
     model: 'ProductModel',
     // 數據代理服務
    proxy : {
              type : 'ajax',// 使用ajax請求
               url :'/read/demo/product.action',// 請求后台讀取數據的地址
              // 讀取數據的工具(數據代理)
              reader : {
                  // 讀取方式按照json字符串格式讀取
                  type : 'json',
                  // json解析成js對象之后讀取所有數據(通常是數組)的屬性名稱。
                  root : 'root',
                  // json解析成js對象之后讀取數據總條數的屬性名稱
                  totalProperty : 'totalProperty'
              }
           },
           // 自動加載
           autoLoad : true,
           // 每頁顯示多少條
           pageSize : PAGESIZE
       });

  

 

寫上面的store,這樣是不是比原來簡單多了,而且更清晰了。

其實proxy屬性也可以定義在model中。

只是通常不建議這么做。因為模型就是模型,他的數據代理是數據源賦予的。這樣也能讓我們的程序中,可以定義很多的模型,然后根據需要選擇模型來搭配代理,從而為同一個模型賦予不同的后台讀取操作。

 

 

 

針對store的各種方法合理使用,我會根絕需要在后續篇章中進行講解。

注:本篇持續更新,首版日期:2012年7月10日15:57:23 第一版

 

PS:近期會出一套關於ExtJs動態form動態grid的相關教程。2012年7月10日16:19:54


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM