我的编程空间,编程开发者的网络收藏夹
学习永远不晚

miniui datagrid的客户端分页解决方法是怎样的

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

miniui datagrid的客户端分页解决方法是怎样的

这期内容当中小编将会给大家带来有关miniui datagrid的客户端分页解决方法是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

官方的解决方法

官方在“在线示例”中给了一个简单的 client pagination 解决方法,代码就不贴了,这里说说它的基本思想和处理过程。

首先,是绑定一个 preload 事件,在这个事情中设置 event.cancel = true,阻止 datagrid  在翻页的时候向服务器请求加载数据。

那么数据从哪来呢?当然只有在外部写一个 ajax 过程获取了。不过取得的数据并不直接交给 datagrid,而是缓存起来,放在dataResult  中。

现在继续说 preload,除了阻止 datagrid 向服务器请求数据之外,preload 还需要从缓存中找到页码对应的数据行,通过  setData设置给 datagrid 渲染出来。OK,这个事情是交给自定义函数 fillData  来实现的。当然,这里还要干点与页面相关的事情,就是setTotalCount()、setPageIndex() 和 setPageCount()。

官方的解决方案展示了 miniui datagrid  客户端分页解决方案的基本思想,但是这个示例太过简单。如果,想把之前的服务端分页改成客户端分页该怎么办?原来已经存在对 load()、setData()  等的调用,现在怎样以最小的代码改动来实现客户端分页?

class ClientPagination

就上面的问题,首先能想到的,就是保留原有 load() 和 setData() 的接口,但是要改变它们的行为。

  • load() 原有行为是提交了〔XXX参数〕,从服务器加载指定页的数据;而现在需要改为加载所有数据。

  • setData() 原来是向 datagrid  设置了需要显示的所有数据行,不管分页(比如可以一次显示出来200条数据);而现在,如果设置的数据量过大,则需要通过客户端分页来逐页显示。

JavaScript  语言是动态有,这使得替换方法成为可能,这是很多静态语言做不到的事情。而替换方法也是解决这个问题时最容易想到的办法。当然除此之外,还得庆幸 miniui 没有采用  jQuery 扩展的方式(如 $grid.datagrid("setData", ...))来实现组件。

替换方法成为可能,但是原有方法还是得保留,因为我们需要通过原有方法来操作 datagrid。所以 ClientPagination  类应该是这个样子:

ClientPagination 的基本结构

注:本文中所有代码都是 ES6 语法

const METHODS = ["setData", "load"];  class ClientPagination {     constructor(datagrid) {         this._datagrid = datagrid;         this._origin = {};         this.setup();     }          setup() {         // TODO 暂存 this._datagrid 的 load、setData 等方法         // 并为 this._datagrid 设置新方法和注册事件     }      destroy() {         // TODO 恢复 this._datagrid 的方法,注销事件     }          onBeforeLoad() {         // 根据官方的解决方案而来         e.cancel = true;         let pageIndex = e.data.pageIndex;         let pageSize = e.data.pageSize;         this.setPageData(pageIndex, pageSize);     }      // 参照 datagrid.load 的函数签名     load(params, success, fail) {         // TODO 实现加载数据,并保存到 this._data 中         // 然后调用 this.setData() 保存和显示数据     }      setData(data) {         // TODO 保存 data 到 this._data 中,         // 然后调用 this.setPageData() 显示当前页的数据     }          setPageData(pageIndex, pageSize) {         // TODO 从缓存的 this._data 中按 pageIndex 和 pageSize 取出要显示的数据行         // 然后通过 this._origin.setData() 设置在 datagrid 中     } }

设置和解除客户端分页

其中 setup 和 destroy 为分别为 datagrid 绑定和解绑客户端分页处理

setup() {        const grid = this._datagrid;        const original = this._origin = {};         METHODS.forEach(name => {            // 暂存原方法            origin[name] = grid[name].bind(grid);            // 替换为本类中定义的新方法            grid[name] = this[name].bind(this);        });         // 暂存事件处理函数,以便后面注销        this._onBeforeLoad = this.onBeforeLoad.bind(this);        grid.on("beforeload", this._onBeforeLoad);    }     destroy() {        this._origin = {};        this._datagrid.un("beforeload", this._onBeforeLoad);        this._datagrid = null;    }

来自官方示例中的关键代码

onBeforeLoad 以及 setPageData 是参照官方解决方案中的 beforeload 事件和 fillData  方法写的。onBeforeLoad 的代码在上面已经有了,现在是 setPageData 的代码

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(allData.length);         grid.setPageIndex(pageIndex);         grid.setPageSize(pageSize);         this._origin.setData(pageData);     }

改写 load

load 方法需要用 ajax 调用来替换原来的 load 方法

load(params, success, fail) {         const grid = this._datagrid;         const url = grid.getUrl();          const settings = {             type: "post",             dataType: "json",             data: params || {}         };          $.ajax(url, settings)             .then(data => {                 this.setData(data);                 if (typeof success === "function") {                     success(data);                 }             }, () => {                 if (typeof fail === "function") {                     fail();                 }             });     }

改写 setData

而 setData 也进行了替换,参数是整表的数据,但只能显示当前页的数据

setData(data) {         const rows = Array.isArray(data)             ? data             : (data.data || []);          this._data = rows;         this.setPageData(this._datagrid.getPageIndex(), this._datagrid.getPageSize());     }

应用

为了方便封装,再加一个静态方法

static wrap(datagrid) {         return new ClientPagination(datagrid);     }

现在只需要在页面初始化(或其它合适的初始化位置)加上

ClientPagination.wrap(mini.get("datagridId"));

如果需要 destroy,可以这样

var cpBlabla = ClientPagination.wrap(mini.get("datagridId")); .... cpBalbal.destory();

通过 ClientPagination 的封装,不需要改变原有的业务代码和设置,就可以实现 miniui datagrid 的客户端分页。

但是这个实现只是解决了当前的问题,如果有新的需求:

当页码在前三页的时候用客户端分页,以减少数据加载次数,翻到后面的时候需要用服务器端分页

上述就是小编为大家分享的miniui datagrid的客户端分页解决方法是怎样的了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

miniui datagrid的客户端分页解决方法是怎样的

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Session对象失效的客户端解决方法284435分享

这篇文章主要介绍了Session对象失效的客户端解决方法,需要的朋友可以参考下
2023-05-20

Session对象失效的客户端解决方法284587解决

这篇文章主要介绍了Session对象失效的客户端解决方法,需要的朋友可以参考下
2023-05-20

telenet客户端的使用及win10系统安装不了telenet客户端的解决方法

  Telnet?这个服务是什么功能呢?我们不仅这样问。那么对于Telnet客户端的一些内容,希望通过本文的讲解,能让大家对这个协议有所了解。  Telnet是基于征求意见文档 (RFC) 854 的标准 Internet 程序和协议。该 RFC 指定在网络中传输和接收未加密 ASCII 字符(纯文本)的方法。  Te
telenet客户端的使用及win10系统安装不了telenet客户端的解决方法
2024-04-18

Session对象失效的客户端解决方法284627详解

这篇文章主要介绍了Session对象失效的客户端解决方法,需要的朋友可以参考下
2023-05-20

Session对象失效的客户端解决方法284567详解

这篇文章主要介绍了Session对象失效的客户端解决方法,需要的朋友可以参考下
2023-05-20

Session对象失效的客户端解决方法284415经验

这篇文章主要介绍了Session对象失效的客户端解决方法,需要的朋友可以参考下
2023-05-20

Session对象失效的客户端解决方法284607经验

这篇文章主要介绍了Session对象失效的客户端解决方法,需要的朋友可以参考下
2023-05-20

Session对象失效的客户端解决方法284815问题及解决

这篇文章主要介绍了Session对象失效的客户端解决方法,需要的朋友可以参考下
2023-05-21

Session对象失效的客户端解决方法284455经验

这篇文章主要介绍了Session对象失效的客户端解决方法,需要的朋友可以参考下
2023-05-20

Session对象失效的客户端解决方法284475处理办法

这篇文章主要介绍了Session对象失效的客户端解决方法,需要的朋友可以参考下
2023-05-20

windows系统用户账户出现红叉的3种解决方法是怎样的

这期内容当中小编将会给大家带来有关windows系统用户账户出现红叉的3种解决方法是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。系统用户账户出现红叉问题非常少见,大部分出现的原因是中毒或者中木马,
2023-06-14

如何解决 Go 中无法识别 Elasticsearch 客户端方法的错误消息?

php小编小新在使用Go语言编写应用程序时,可能遇到无法识别Elasticsearch客户端方法的错误消息。这可能是因为缺少必要的依赖或配置问题导致的。为了解决这个问题,可以采取以下几个步骤:1. 确保已经正确安装了Elasticsearc
如何解决 Go 中无法识别 Elasticsearch 客户端方法的错误消息?
2024-02-09

SAP C4C OData服务的filter以及客户端分页和排序的使用方式是什么

SAP C4C OData服务的filter以及客户端分页和排序的使用方式是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。假设系统里已经有许多的Lead历史
2023-06-03

解决网站开发中首页不在第一页的问题的方法是怎样的

解决网站开发中首页不在第一页的问题的方法是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么情况才会影响关键词排名呢?总结起来有两个关键所在: 1、首页不在第一页; 2、
2023-06-12

Python不可用的解决方法是怎么样的

本篇文章给大家分享的是有关Python不可用的解决方法是怎么样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。TCL or Python are not available,
2023-06-17

GD编译出错解决方法是怎样的

这期内容当中小编将会给大家带来有关GD编译出错解决方法是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。编译最新的2.0.35版本,用默认的 ./configure编译 当make的时候,出现以下错误
2023-06-13

编程热搜

目录