本系列教程基本可以看做是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
