天天看點

jqgrid用戶端排序

jqgrid的用戶端排序隻需要在colModel的related column中把sortable設為true,把option loadonce設為true。啟用用戶端排序後,jqgrid将會把本頁的所有資料download到local,值得注意的是,download的資料隻是colModel中包含的資料,colModel中不包含的資料jqgrid會丢掉。

可以通過rowObject這個對象來驗證。在local排序的時候,rowObject以name:value對的形式存儲下colModel中的所有資料。以formatter為例,假使定義一個customer的checkbox:

formatter: function (cellValue, option, rowObject) {

var checkbox = '<input type="checkbox" disabled="disabled" rowId="'+option.rowId+'" col1=' +rowObject.col1+' col2='+rowObject.col2+ '/>';

return checkbox;}},

其中col1和col分别為server端傳過來的資料,但是在colModel中隻包含了col1,在用戶端排序的時候checkbox的col2屬性顯示為undefined。

并且,當server端的傳過來的資料如果有依賴關系,比如傳過來的是Customer類,但它内部包含了Consume類,在初次download頁面時可以通過rowObject.consume.comsumeAttribute來得到相應的值。但是在用戶端排序之後,在采用rowObject.consume.comsumeAttribute這種方式來取值就會出錯。jqgrid在local存儲colModel的資料時按照colModel的name來存值,在用戶端sorting之後我們隻能用rowObject.colName(colModel中column的name)來取值。是以為保證用戶端排序的正确性,如果存在上面的依賴關系的情況下,最好在beforeProcessing中對資料進行轉換,例如:

data.Customer[i].total = data.Customer[i].Consume.total;

另外分組排序可能會遇到這樣的問題:隐藏某一列并用這一列來排序,而這一列隻包含兩種狀态,我們想通過checkbox的狀态來顯示這個屬性的狀态,同時通過改變checkbox的狀态來update這個屬性的值,這時我們的colModel中就有兩列對應了response object的一個attribute,例如分别為col1(隐藏列)和col2(checkbox列),在它們的colModel中将jsonmap和xmlmap都指向response object的這個attribute(或者在beforeProcessing中對資料進行轉換,但是name必須和attribute的name相同)。但是要想在用戶端正常排序的話,col1的name必須和response object的attribute name相同,而col2的name可以随便命名。

繼續閱讀