首頁 > web前端 > js教程 > 主體

深入淺析Extjs中store分組功能的使用方法_javascript技巧

WBOY
發布: 2016-05-16 15:04:36
原創
1224 人瀏覽過

在專案實踐的過程中,遇到需要將grid中資料根據某一欄位分組的要求,當然,這個功能在api中有,在此列出來以供大家查找:

兩點要注意的地方:

1、建立store時,需要設定groupField屬性的值,也就是需要分組的值

for example:

JavaScript程式碼

Ext.define('Person', { 
extend: 'Ext.data.Model', 
fields: ['name', 'sex'] 
}); 
登入後複製

在這個資料模型中,我們需要以性別(sex)分組,那麼請看下面的store

JavaScript程式碼

var PersonStore = Ext.create('Ext.data.Store', { 
storeId: 'PersonStore', 
model: 'Person', 
groupField: 'sex', 
data: [{ 
name: 'hongmei li', 
sex: 'female' 
},{ 
name: 'san zhang', 
sex: 'male' 
},{ 
name: 'Jim Green', 
sex: 'male' 
},{ 
name: 'Lily', 
sex: 'female' 
},{ 
name: 'Lucy', 
sex: 'female' 
}] 
}); 
登入後複製

接下來,我們要定義分組顯示的tpl

JavaScript程式碼

var groupingFeature= Ext.create('Ext.grid.feature.Grouping',{ 
groupHeaderTpl: 'sex: {name} ({rows.length} Item{[values.rows.length > 1 ? "s" : ""]})' 
});//注意其中{name}即为store中sex列所对应的值 
登入後複製

在gridPanel中,程式碼如下:設定features為上述定義的groupingFeature

JavaScript程式碼

var grid = Ext.create('Ext.grid.Panel', { 
renderTo: Ext.getBody(), 
store: PersonStore, 
width: 600, 
height: 400, 
title: 'Person', 
features: [groupingFeature], 
columns: [{ 
text: 'Name', 
flex: 1, 
dataIndex: 'name' 
},{ 
text: 'sex', 
flex: 1, 
dataIndex: 'sex' 
}] 
}); 
登入後複製

效果圖如下:

 

當然實現分組後,在gridPanel中sex這一列就可以不用顯示。

要注意的是store裡的資料如果在變化的時候,分組是不是也可以正常顯示呢?

現在為grid增加一個itemclick事件,程式碼如下:

JavaScript程式碼

listeners:{ 
itemclick:function(thisview,record){ 
PersonStore.<span style="color:#ff0000;">add</span>([{name:"li",sex:"male"},{name:"zhang",sex:"female"}]); 
} 
} 
登入後複製

效果如下圖

 

可以看出來,介面不是我們想要的,那麼要如何解決呢? (最開始愚笨的解決方案是我將此gridPanel移除並銷毀掉,重新加載)我將listeners監聽事件的程式碼做了一些變換

JavaScript程式碼

listeners:{ 
itemclick: function (thisview,record){ 
PersonStore.loadData([{name: "li" ,sex: "male" },{name: "zhang" ,sex: "female" }], true ); 
} 
} 
登入後複製

再看效果:

 

這個就是我們想要的效果,在動態變化store中的資料時,分組也要實現,而不是將資料追加在gridPanel的最後。對應這兩段程式碼的區分,主要在,store加入資料的方法,前者是add(record),後者是loadData(records,[append])

起初不能理解為什麼同樣是store添加數據,效果卻不一樣,看官方文檔的解釋,add(),The new Model instances will be added at the end of the existing collection.(將數據追加在集合的最後)恍然大悟,loadData是依照store的規則將資料載入進來。

另外,如何移除組中最舊一行,自己動手查了一下,文檔實現了,在這裡與大家分享:

//將前面的listeners監聽事件修改如下:

注意其中first([boolean group])方法,如果不傳參數,獲取的是store中的第一條數據,傳參為true時,返回的是store分組以組名為key,組內第一個資料為value的多個對象,PersonStore.first(true).female取得female群組內的第一個數據,想取得male中的,可以使用PersonStore.first(true).male

JavaScript程式碼

listeners:{ 
itemclick: function (thisview,record){ 
PersonStore.loadData([{name: "li" ,sex: "male" },{name: "zhang" ,sex: "female" }], true ); 
alert(PersonStore.first( true ).female.get( 'name' )); 

console.log(PersonStore.first( true ).female); 
PersonStore.remove(PersonStore.first( true ).female); 
// console.log(PersonStore.getAt(0));
} 
}
登入後複製

為避免removedRecords佔用內存,進行了進一步的處理,功能可以實現,但是方法有些笨,大家有好的辦法可以交流交流

看程式碼:

listeners:{ 
itemclick:function(thisview,record){ 
PersonStore.loadData([{name:"li",sex:"male"},{name:"zhang",sex:"female"}],true); 
alert(PersonStore.first(true).female.get('name')); 
console.log(PersonStore.first(true)); 
PersonStore.remove(PersonStore.first(true).female); 
var recs = PersonStore.getRange(); 
console.log(recs); 
//PersonStore.removeAll(true);//这句有没有都可以 
PersonStore.loadRecords(recs);//重新load数据,内存中记录的removed掉的就没有了 
console.log(PersonStore); 
alert(PersonStore.getRemovedRecords.length);//这句alert结果为0 
// console.log(PersonStore.getAt(0)); 
} 
}
登入後複製

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板