摘要:在前一篇,的客戶端分頁(yè)解決方案中留下了一個(gè)問(wèn)題如果前三頁(yè)只需要加載一次數(shù)據(jù),采用客戶端分頁(yè),之后的每一頁(yè)都仍然從服務(wù)器獲取,應(yīng)該怎么辦現(xiàn)在就來(lái)改造,讓它實(shí)現(xiàn)這個(gè)功能。所以正確的解決辦法是試驗(yàn)一下就能證明它的正確性。
在前一篇,miniui datagrid 的客戶端分頁(yè)解決方案 中留下了一個(gè)問(wèn)題:如果前三頁(yè)只需要加載一次數(shù)據(jù),采用客戶端分頁(yè),之后的每一頁(yè)都仍然從服務(wù)器獲取,應(yīng)該怎么辦?
現(xiàn)在就來(lái)改造 ClientPagination,讓它實(shí)現(xiàn)這個(gè)功能。不過(guò)在此之前需要先解決上個(gè)版本中存在的一個(gè)問(wèn)題:destroy() 并沒(méi)有完全恢復(fù)原有的 datagrid 對(duì)象,因?yàn)橥嗽?destroy() 中恢復(fù) this._datagrid 的 load 和 setData 函數(shù)。
修復(fù)一個(gè)重要的 BUG很容易想到下面的代碼,不過(guò)下面這個(gè)代碼是個(gè)錯(cuò)誤的實(shí)現(xiàn)
destroy() { // 錯(cuò)誤的實(shí)現(xiàn) METHODS.forEach(name => { this._datagrid[name] = this._origin[name]; }); // .... }
別忘了 this._origin 中保存的每個(gè)函數(shù)都是通過(guò)原函數(shù) bind() 而來(lái),所以其實(shí)已經(jīng)不是原函數(shù)了。此外,也很容易想到 miniui 的 datagrid 多半是類(lèi)實(shí)現(xiàn),原來(lái)的 load() 和 setData() 應(yīng)該來(lái)源于原型。所以正確的解決辦法是
// in destroy"s body METHODS.forEach(name => { delete this._datagrid[name]; });
試驗(yàn)一下就能證明它的正確性。
改造 ClientPagination 修改 beforeload 事件處理原來(lái)在 beforeload 事件中直接設(shè)置了 event.cancel = true 來(lái)避免遠(yuǎn)程加載,但現(xiàn)在情況發(fā)生了變化,只需要在頁(yè)碼小于3(miniui 的 pageIndex 是從 0 開(kāi)始)避免遠(yuǎn)程加載,大于等于 3 的時(shí)候仍然需要從服務(wù)器獲取頁(yè)面數(shù)據(jù),所以
const pageIndex = e.data.pageIndex; if (pageIndex < 3) { e.cancel = true; } else { // 直接返回,不需要通過(guò) setPageData() 來(lái)設(shè)置頁(yè)面數(shù)據(jù) return; }接下來(lái)該干啥
接下來(lái)還有一些細(xì)節(jié)需要處理。
首先就是 setData 中沒(méi)有使用數(shù)據(jù)的 total 值,因?yàn)樵瓉?lái)純客戶端分頁(yè)的時(shí)候,數(shù)據(jù)總行數(shù)就是 total 值,但現(xiàn)在不一樣了,設(shè)置的數(shù)據(jù)不一定是所有數(shù)據(jù),所以需要先檢查 total,如果沒(méi)有 total 再使用 rows.length 代替。
setData(data) { const rows = Array.isArray(data) ? data : (data.data || []); this._data = rows; this._total = data.total || rows.length; this.setPageData(this._datagrid.getPageIndex(), this._datagrid.getPageSize()); }
相應(yīng)的,還需要在 setPageData() 里修改一個(gè) setTotalCount() 的實(shí)參
grid.setTotalCount(this._total);
搞定!
源代碼 ClientPagination mini_clientpagination.jsconst METHODS = ["setData", "load"]; class ClientPagination { static wrap(datagrid) { return new ClientPagination(datagrid); } constructor(datagrid) { this._datagrid = datagrid; this._origin = {}; this.setup(); } setup() { const grid = this._datagrid; const origin = this._origin = {}; METHODS.forEach(name => { // 綁定到原對(duì)象的原方法 origin[name] = grid[name].bind(grid); // 替換為本類(lèi)中定義的新方法 grid[name] = this[name].bind(this); }); // 暫存事件處理函數(shù),以便后面注銷(xiāo) this._onBeforeLoad = this.onBeforeLoad.bind(this); grid.on("beforeload", this._onBeforeLoad); } destroy() { // 恢復(fù)原方法(來(lái)自 datagrid 類(lèi)的 prototype) // 只需要?jiǎng)h除附加到對(duì)象上的同名方法即可 METHODS.forEach(name => { delete this._datagrid[name]; }); this._origin = {}; this._datagrid.un("beforeload", this._onBeforeLoad); this._datagrid = null; } onBeforeLoad(e) { // 根據(jù)官方的解決方案而來(lái) const pageIndex = e.data.pageIndex; if (pageIndex < 3) { e.cancel = true; } else { // NOTE 一般來(lái)說(shuō)不需要修改 url,直接通過(guò) pageIndex 參數(shù)即可從后臺(tái)獲取不同頁(yè)的數(shù)據(jù) // 這里因?yàn)槭怯玫撵o態(tài) JSON 數(shù)據(jù),所以需要修改 url e.url = `data/page${pageIndex}.json`; return; } let pageSize = e.data.pageSize; this.setPageData(pageIndex, pageSize); } load(params, success, fail) { const grid = this._datagrid; const pageIndex = grid.getPageIndex(); const url = grid.getUrl(); params = $.extend(pageIndex < 3 ? {} : { pageIndex: pageIndex, pageSize: grid.getPageSize() }, params); const settings = { type: "get", dataType: "json", data: params }; $.ajax(url, settings) .then(data => { this.setData(data); if (typeof success === "function") { success(data); } }, () => { if (typeof fail === "function") { fail(); } }); } setData(data) { const rows = Array.isArray(data) ? data : (data.data || []); this._data = rows; this._total = data.total || rows.length; this.setPageData(this._datagrid.getPageIndex(), this._datagrid.getPageSize()); } setPageData(pageIndex, pageSize) { const allData = this._data; let start = pageIndex * pageSize; if (start >= allData.length) { start = 0; pageIndex = 0; } const end = Math.min(start + pageSize, allData.length); const pageData = []; for (let i = start; i < end; i++) { pageData.push(allData[i]); } const grid = this._datagrid; grid.setTotalCount(this._total); grid.setPageIndex(pageIndex); grid.setPageSize(pageSize); this._origin.setData(pageData); } }測(cè)試頁(yè)面 index.html
Client Pagination 序號(hào)名稱
當(dāng)然還有 data 目錄下的數(shù)據(jù)源 all.json 和 page3.json
all.json 中是前3頁(yè)的數(shù)據(jù)
page3.json 中是第4頁(yè)的數(shù)據(jù)
數(shù)據(jù)結(jié)構(gòu)(僅結(jié)構(gòu)
{ "data": [], "total": 50 }
其中 data 的每一項(xiàng)結(jié)構(gòu)
{ "order": 1108, "name": "bridge" }
完整的測(cè)試數(shù)據(jù)就自己拼吧,當(dāng)然最好是還是用服務(wù)端數(shù)據(jù),通過(guò)參數(shù)來(lái)返回不同的數(shù)據(jù)行。
我懶,懶得為了個(gè)實(shí)驗(yàn)還去寫(xiě)服務(wù)端
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/91056.html
摘要:官方的解決方案展示了客戶端分頁(yè)解決方案的基本思想,但是這個(gè)示例太過(guò)簡(jiǎn)單。原來(lái)是向設(shè)置了需要顯示的所有數(shù)據(jù)行,不管分頁(yè)比如可以一次顯示出來(lái)?xiàng)l數(shù)據(jù)而現(xiàn)在,如果設(shè)置的數(shù)據(jù)量過(guò)大,則需要通過(guò)客戶端分頁(yè)來(lái)逐頁(yè)顯示。 官方的解決方案 官方在在線示例中給了一個(gè)簡(jiǎn)單的 client pagination 解決方案,代碼就不貼了,這里說(shuō)說(shuō)它的基本思想和處理過(guò)程。 首先,是綁定一個(gè) preload 事件,...
摘要:表格的刷新保留查詢條件的刷新當(dāng)前分頁(yè)的數(shù)據(jù)更新,請(qǐng)使用也可以使用獲取當(dāng)前接口請(qǐng)求的參數(shù)。 本期我們要講述一下最常見(jiàn)的布局————表格:如何引入datagrid組件(在文章的末尾)來(lái)個(gè)demo,調(diào)用的代碼 let options = { container:.con,//表格的容器 paging:{//分頁(yè)的相關(guān)配置,其他參數(shù)配置參考[諾諾組件之分頁(yè)(舊版)][1] ...
摘要:是一個(gè)基于的快速開(kāi)發(fā)插件,支持?jǐn)?shù)據(jù)表格增刪改查操作,提供通用的組件,通過(guò)配置實(shí)現(xiàn)數(shù)據(jù)請(qǐng)求,減少前端重復(fù)開(kāi)發(fā)的工作。 fsLayui 是一個(gè)基于layui的快速開(kāi)發(fā)插件,支持?jǐn)?shù)據(jù)表格增刪改查操作,提供通用的組件,通過(guò)配置html實(shí)現(xiàn)數(shù)據(jù)請(qǐng)求,減少前端js重復(fù)開(kāi)發(fā)的工作。 GitHub下載 碼云下載 測(cè)試環(huán)境地址:http://fslayui.itcto.cn css和js引用 公...
摘要:是一個(gè)基于的快速開(kāi)發(fā)插件,支持?jǐn)?shù)據(jù)表格增刪改查操作,提供通用的組件,通過(guò)配置實(shí)現(xiàn)數(shù)據(jù)請(qǐng)求,減少前端重復(fù)開(kāi)發(fā)的工作。 fsLayui 是一個(gè)基于layui的快速開(kāi)發(fā)插件,支持?jǐn)?shù)據(jù)表格增刪改查操作,提供通用的組件,通過(guò)配置html實(shí)現(xiàn)數(shù)據(jù)請(qǐng)求,減少前端js重復(fù)開(kāi)發(fā)的工作。 GitHub下載 碼云下載 測(cè)試環(huán)境地址:http://fslayui.itcto.cn css和js引用 公...
摘要:什么是是一種基于和的用戶界面插件集合。為創(chuàng)建現(xiàn)代化,互動(dòng),應(yīng)用程序,提供必要的功能。是個(gè)完美支持網(wǎng)頁(yè)的完整框架。很簡(jiǎn)單但功能強(qiáng)大的。返回則取消該動(dòng)作。該函數(shù)有下列參數(shù)要傳遞到遠(yuǎn)程服務(wù)器的參數(shù)對(duì)象。當(dāng)檢索數(shù)據(jù)成功時(shí)調(diào)用的回調(diào)函數(shù)。 什么是easyUI easyui是一種基于jQuery、Angular.、Vue和React的用戶界面插件集合。easyui為創(chuàng)建現(xiàn)代化,互動(dòng),JavaScr...
閱讀 975·2021-11-24 09:39
閱讀 3404·2021-10-27 14:20
閱讀 2329·2019-08-30 14:08
閱讀 3371·2019-08-29 16:34
閱讀 2185·2019-08-26 12:14
閱讀 2112·2019-08-26 11:54
閱讀 2780·2019-08-26 11:44
閱讀 2485·2019-08-26 11:38