大家好,繼上次的treepanel之后,今天給大家介紹gridpanel,gridpanel也是在extjs編程中出現(xiàn)頻率高的一種組件,是必須要掌握的,當(dāng)然,gridpanel比treepanel要復(fù)雜的多,基本上能實(shí)現(xiàn)excel中大部分基本功能,功能相當(dāng)強(qiáng)大。
先上張截圖吧,一睹grid的芳容(這是未經(jīng)過(guò)處理的最基本的grid界面)
grid的實(shí)現(xiàn)包括model、store和view三個(gè)層面。
從model開始,先貼代碼再講解:
代碼的一開始,先定義一個(gè)model類,名字自己取,然后就是model里的鍵值對(duì)屬性賦值,首先最重要的就是這個(gè)自定義的類要繼承自Ext.data.Model,用extend屬性來(lái)表示,再就是這個(gè)表格的基本屬性,即表格每一列代表的含義,用field屬性來(lái)表示,field是一個(gè)數(shù)組類型,里面存放各個(gè)列屬性對(duì)象,每個(gè)對(duì)象里面要定義對(duì)象的名字(name)和類型(type),便于與后面的store層進(jìn)行連接。至于idProperty(可有可無(wú))這個(gè)屬性后面講解。這樣model就基本寫好了,很簡(jiǎn)單吧。
下面store層,代碼如下:
store層也是自定義一個(gè)類,繼承自Ext.data.Store,然后這里也是定義model,就是前面寫的model層,model的賦值即前面寫的model層的名稱,然后最主要的是proxy,定義從后臺(tái)去取數(shù)據(jù),然后加載到grid 中,proxy中url好說(shuō),extraParams添加額外的參數(shù)傳到后臺(tái),已json的形式讀取數(shù)據(jù)。store中的autoload屬性也需要賦值,代表程序什么時(shí)候像后臺(tái)發(fā)送請(qǐng)求加載數(shù)據(jù),可以賦boolean/Object,默認(rèn)的是false,默認(rèn)不發(fā)送請(qǐng)求,但可以在程序中可以通過(guò)grid的getStore( )函數(shù)拿到store對(duì)象然后調(diào)用load函數(shù),然后系統(tǒng)就會(huì)像后臺(tái)發(fā)送定義的proxy里的內(nèi)容并加載,若手動(dòng)設(shè)置為true,表示一開始就請(qǐng)求數(shù)據(jù)。上面代碼賦值的是一個(gè)對(duì)象,用于分頁(yè)用的。 當(dāng)然,store也可以裝載已經(jīng)定義好的數(shù)據(jù)集,設(shè)置store的data屬性,里面存放對(duì)象數(shù)組,鍵值對(duì)與model相對(duì)應(yīng),則表格自動(dòng)填充這些數(shù)據(jù),如下:
最后就是view層的代碼實(shí)現(xiàn)了:
view層的信息量就比較大了,所以基本信息都在代碼里添加注釋,應(yīng)該看的還比較清楚,有的屬性有不同的配置,大家可以在官網(wǎng)api上查找該屬性,上面有詳細(xì)的解釋,鑒于上面代碼已經(jīng)可以代表大部分的需求,這里就不在多說(shuō)。
好了,上面代碼基本上能實(shí)現(xiàn)大部分對(duì)于表格的要求了,另外gird還有其他增強(qiáng)功能,比如拖拽、分組等等,每一列還有很多其他的屬性進(jìn)行設(shè)置,比如常見的render(渲染)、format(格式化)等等,今天由于時(shí)間原因就不寫了,以后要是有時(shí)間再寫一篇gird的增強(qiáng)篇,在這里像大家致歉。
貼一下grid的增加、刪除、保存行的操作代碼,比較簡(jiǎn)單。
下面說(shuō)一下大家普遍遇到的grid保存中store.getUpdatedRecords();拿到數(shù)據(jù)為空的問(wèn)題,我也是在上面糾結(jié)了一段時(shí)間,覺得有必要在這把解決方案提出來(lái)。
grid的model層有一個(gè)屬性:idProperty ,默認(rèn)是id,這個(gè)屬性就是grid所有列的主屬性,相當(dāng)于數(shù)據(jù)庫(kù)中的主鍵定義,是不可缺少的,所以當(dāng)你的model中配置沒有id基本字段的時(shí)候,extjs內(nèi)部的函數(shù)如getUpdatedRecords();就拿不到行的句柄(就用大家都懂的句柄這個(gè)詞吧),所以取出來(lái)的值為空,解決方案就是配置idProperty為你定義的字段中一個(gè),這樣就解決了。 可是,有的兄臺(tái)可能碰到跟我一樣的問(wèn)題,我的表格是可以新添加行的,用store的insert( Number index, Ext.data.Model[] records )函數(shù)添加新的一行,這個(gè)添加的model中每個(gè)屬性都是空,但是,idProperty也配置了,結(jié)果拿出來(lái)的東西還是為空,我就納悶了,怎么還是行不通,最后經(jīng)過(guò)慢慢對(duì)比調(diào)試,終于發(fā)現(xiàn)了根本問(wèn)題,在新增的一行中idProperty設(shè)置的屬性必須要賦值,就像主鍵不能為空一樣,經(jīng)過(guò)賦值后的model對(duì)象插入到gird中后再調(diào)用getUpdatedRecords(); 就沒有問(wèn)題了,能正常拿出更改的值。
最后說(shuō)一下grid的分頁(yè)組建的實(shí)現(xiàn)細(xì)節(jié)。 在store層的定義中就定義了pageSize表示每一頁(yè)的行數(shù),autoLoad中定義一個(gè)對(duì)象(如上面store中的autoLoader),上面表示最開始的起始位置和請(qǐng)求個(gè)數(shù),這樣在往后臺(tái)請(qǐng)求的URL中就增加了兩個(gè)請(qǐng)求參數(shù)start和limit,按上面代碼就是添加了start=0&limit=5,這樣后臺(tái)就可以接受參數(shù)進(jìn)行處理,那么上一頁(yè)下一頁(yè)又是怎么處理的呢,在bbar中定義了分頁(yè)組建,當(dāng)點(diǎn)擊下一頁(yè)的按鈕時(shí),extjs會(huì)自動(dòng)像后臺(tái)發(fā)送一個(gè)URL請(qǐng)求,與proxy是同一個(gè)url請(qǐng)求,同樣的會(huì)添加兩個(gè)請(qǐng)求參數(shù)start和limit,只是這時(shí)的start值就是當(dāng)前的值加上(下一頁(yè))或者減去(上一頁(yè))pageSize大小,在后臺(tái)進(jìn)行處理就行了。
最后的最后,本文如果寫的有什么不足,希望大家與我交流,共同學(xué)習(xí),共同進(jìn)步。。。。。。。。。 |
|