avalon分页组件 (1.4.x版本)

随着avalon2的推出,avalon1的官网已经不再维护了,现在似乎是找不到avalon 1.4版本的官方文档了,所以本文章所有的内容均不保证正确性,只能保证在同样的前置条件下可以实现相同的功能,具体代码见github内容。

本文UI基于bootstrap创建,使用的avalon版本为avalon 1.4.7。具体代码如下:

template代码为下面代码:

  1. <style>
  2. .current {
  3. background-color: #2d97de !important;
  4. color: #fff !important;
  5. }
  6. </style>
  7. <div ms-controller="page" ms-widget="pager,testtest,$opts">
  8. <ul class="pagination" ms-if="pageCount>1">
  9. <li ms-click="homePage()" ms-class="{{currentPage==1?'disabled':''}}"><a href="##">首页</a></li>
  10. <li ms-click="lastPage()" ms-class="{{currentPage==1?'disabled':''}}"><a href="##">上一页</a></li>
  11. <li><a href="##" ms-if="firstDotShow">...</a></li>
  12. <li ms-repeat="showArr" ms-click="goTomodel(el)"><a href="##" ms-text="el" ms-class="{{el==currentPage?'current':''}}"></a></li>
  13. <li><a href="##" ms-if="lastDotShow">...</a></li>
  14. <li ms-click="nextPage()" ms-class="{{currentPage==pageCount?'disabled':''}}"><a href="##">下一页</a></li>
  15. <li ms-click="endPage()" ms-class="{{currentPage==pageCount?'disabled':''}}"><a href="##">尾页</a></li>
  16. </ul>
  17. </div>

如上面代码,其中ms-controller的vmodel名是自定义的,且不能重复。引用分页组件的方法为:ms-widget="pager,testtest,$opts",其中,pager为组件名,testtest为新生成的vmodel名,且不能够与已经存在的vmodel重复,因为实际生成了这些vmodel了(avalon中ms-controller的值是不能重复的)。$opts为传入的参数值,可以传入用户自定义的参数值,如在本例中,自定义的值为:

  1. $opts: {
  2. pageCount: 1,
  3. cb: avalon.noop
  4. }

表示传入组件的总页数为1,回调函数为空函数,在初始化(avalon.ready)的时候再书写回调函数。

组件的书写代码如下:

  1. //使用avalon自带的amd加载器,加载组件依赖avalon
  2. define(["avalon"],function (avalon) {
  3. //组件名为pager,这就是为什么ms-widget里面第一个参数是pager
  4. avalon.ui["pager"] =function (element, data, vmodels) {
  5. var innerHTML = element.innerHTML;
  6. //由于innerHTML要依赖许多widget后来添加的新属性,这时如果被扫描肯定报“不存在”错误
  7. //因此先将它清空
  8. avalon.clearHTML(element);
  9. //重新定义一个vmodel,如果要使用组件内的数据,用‘data.组件名+条件’获取。
  10. //如下面代码的 data.pagerId即获取组件当前的controller,data.pagerOptions为获取组件的参数, 即html中的$opts
  11. //如果想要在新建的vmodels里面修改参数值只需要把该参数设为如下形式:
  12. // var test = data.pagerOptions.test;
  13. //这样子就可以在html(本文的html表示使用组件的环境)里面修改test值,但本文不建议这么做。
  14. //建议将这一新建的vmodel设成一个黑盒,让用户无法修改里面的数据,以提高组件的复用性,如果想 要通过html修改分页的内容的话,下面会有介绍。
  15. var model=avalon.define(data.pagerId,function (vm) {
  16. //将传过来的参数深拷贝(mix,用法见文档)
  17. avalon.mix(vm,data.pagerOptions);
  18. vm.currentPage=1;
  19. vm.pageArr=[];
  20. vm.showArr=[];
  21. vm.lastDis=true;
  22. vm.nextDis=false;
  23. vm.firstDotShow=false;
  24. vm.lastDotShow=false;
  25. vm.getPages=function () {
  26. //使用range创建循环数组
  27. model.pageArr=avalon.range(1,this.pageCount+1);
  28. model.showPage();
  29. };
  30. vm.showPage=function () {
  31. var count=this.pageCount;
  32. var current=model.currentPage;
  33. //分页逻辑判断
  34. if (count<6){
  35. model.showArr=model.pageArr;
  36. model.firstDotShow=false;
  37. model.lastDotShow=false;
  38. }else if(current<4){
  39. model.showArr=avalon.range(1,6);
  40. model.firstDotShow=false;
  41. model.lastDotShow=true;
  42. }else if(current>count-3){
  43. model.showArr=avalon.range(count-4,count+1);
  44. model.firstDotShow=true;
  45. model.lastDotShow=false;
  46. }else{
  47. model.showArr=avalon.range(current-2,current+3);
  48. model.firstDotShow=true;
  49. model.lastDotShow=true;
  50. }
  51. //自定义回调
  52. this.cb(current);
  53. };
  54. vm.lastPage=function () {
  55. if (model.currentPage>1){
  56. model.currentPage--;
  57. }
  58. };
  59. vm.nextPage=function () {
  60. if(model.currentPage<model.pageCount){
  61. console.log(that)
  62. model.currentPage++;
  63. }
  64. };
  65. vm.homePage=function () {
  66. model.currentPage=1;
  67. };
  68. vm.endPage=function () {
  69. model.currentPage=model.pageCount;
  70. };
  71. vm.goToModel=function (index) {
  72. model.currentPage=index;
  73. }
  74. vm.$watch('currentPage',function () {
  75. //监听到当前页发生改变时,重新渲染页面
  76. this.showPage();
  77. });
  78. });
  79. model.$init=function() {
  80. //初始化
  81. element.innerHTML = innerHTML;
  82. model.getPages();
  83. avalon.scan(element, [model].concat(vmodels));
  84. };
  85. return model;//必须返回model
  86. }
  87. //在default里面可以设置实例化后自定义的数据
  88. avalon.ui["pager"].defaults = {
  89. pageCount:1
  90. //里面定义的内容均可以在实例化后进行修改
  91. };
  92. return avalon ; //必须返回avalon
  93. })

从上面的代码可以得到,组件书写的大体思路如下:

  1. 引入依赖avalon,然后,命名组件名为 avalon.ui[comomponentName] =function (element, data, vmodels) {}
  2. 将template中的内容缓存到临时变量,然后清空template内的内容。
  3. 新建一个vmodel,形式如下,其中新生成的vmodel为data.pagerId,即pagerId为固定形式(uiName+'Id'),深拷贝传入的参数,然后在进行内部运算:
  1. var model=avalon.define(data.pagerId,function (vm) {
  2. avalon.mix(vm,data.pagerOptions);
  3. ...
  4. }
  1. 对新生成的vmodel使用model.$init进行初始化设置,并在这时候进行扫描,保证新生成的属性能够被扫描到,同时返回model。
  2. 对组件进行初始化设置,使用关键字defaults.

总结一下大概的思路如下面代码所示:

  1. define(['avalon'],function(avalon){
  2. avalon.ui['pager'] =function(element,data,vmodels){
  3. var innerHTML=element.innerHTML;
  4. avalon.clearHTML(element);
  5. var model=avalon.define(data.pagerId,function(vm){
  6. avalon.mix(vm,data.pagerOptions);
  7. ...
  8. })
  9. model.$init=function(){
  10. ...
  11. }
  12. return model;
  13. }
  14. avalon.ui['pager'].defaults={
  15. ...
  16. };
  17. return avalon;
  18. })

实例化方法如下:

  1. 在页面中使用上述中的template作为分页内容。
  2. js代码实例如下,引入pager组件,然后在初始化的时候传入需要的回调函数,并给自定义的参数$opts赋值:
  1. //还是利用avalon自带的amd加载器
  2. require(["pager"], function () {
  3. var vm = avalon.define({
  4. $id: 'page',
  5. $opts: {
  6. pageCount: 1,
  7. cb: avalon.noop
  8. }
  9. });
  10. avalon.ready(function () {
  11. $.ajax({
  12. url: URL,
  13. ...
  14. success: function (res) {
  15. vm.$opts.pageCount = res.pageCount;
  16. vm.$opts.cb = ...
  17. };
  18. avalon.scan()
  19. },
  20. error: function (xhr, status, err) {
  21. console.log(err);
  22. }
  23. });
  24. });
  25. });

目前掌握的avalon1.4版本的组件就是这么写的,应该还是存在诸多问题,希望知晓的大神能够不吝指出。

基于avalon1.4.x ----分页组件编写的更多相关文章

  1. 基于vue2.0的分页组件开发

    今天安排的任务是写基于vue2.0的分页组件,好吧,我一开始是觉得超级简单的,但是越写越写不出来,写的最后乱七八糟的都不知道下句该写什么了,所以重新捋了思路,小结一下- 首先写组件需要考虑: 要从父组 ...

  2. 基于jQuery封装的分页组件

    前言: 由于项目需要实现分页效果,上jQuery插件库找了下,但是木有找到自己想要的效果,于是自己封装了个分页组件. 思路: 主要是初始化时基于原型建立的分页模板然后绑定动态事件并实现刷新DOM的分页 ...

  3. 基于 bootstrap 的 vue 分页组件

    申手党点这里下载示例 基于 bootstrap 的 vue 分页组件,我想会有那么一部分同学,在使用Vue的时候不使用单文件组件,因为不架设 NodeJS 服务端.那么网上流传的 *.vue 的各种分 ...

  4. 基于 Python 的自定义分页组件

    基于 Python 的自定义分页组件 分页是网页中经常用到的地方,所以将分页功能分出来,作为一个组件可以方便地使用. 分页实际上就是不同的 url ,通过这些 url 获取不同的数据. 业务逻辑简介 ...

  5. 基于jQuery封装的分页组件(可自定义设置)

    jQuery封装的分页组件 前几天做了一个vue的组件分页,而现在需求是jquery的分页,我就根据我自己的需求写了一个.在网上找了很久的基于jquery的分页封装,可是都不是我想要的结果,那么今天我 ...

  6. 一款基于vue2.0的分页组件---写在页面内

    通过 Vue2.0 实现的分页 可自由设置分页显示的多少.上一页.下一页.省略号等,也可直接输入跳转到的页码进行跳转,分页的样式可自由调整 // 1.页面的 head 部分,需要设计好页面的样式 .p ...

  7. vue2.0实现分页组件

    最近使用vue2.0重构项目, 需要实现一个分页的表格, 没有找到合适的组件, 就自己写了一个, 效果如下: 该项目是使用 vue-cli搭建的, 如果你的项目中没有使用webpack,请根据代码自己 ...

  8. 基于Vue.js的表格分页组件

    有一段时间没更新文章了,主要是因为自己一直在忙着学习新的东西而忘记分享了,实在惭愧. 这不,大半夜发文更一篇文章,分享一个自己编写的一个Vue的小组件,名叫BootPage. 不了解Vue.js的童鞋 ...

  9. 一步步编写avalon组件02:分页组件

    本章节,我们做分页组件,这是一个非常常用的组件.grid, listview都离不开它.因此其各种形态也有. 本章节教授的是一个比较纯正的形态,bootstrap风格的那种分页栏. 我们建立一个ms- ...

随机推荐

  1. c#类初始化器

    其实类型初始化器只是一种语法糖这样写MyClass a=new MyClass{ filedOne="a" ,filedTwo="b" };会被编译器编译成和如 ...

  2. CocoaPod安装

    http://www.360doc.com/content/14/0309/10/11029609_358970353.shtml http://www.bubuko.com/infodetail-4 ...

  3. oracle数据库ID自增长

    使用sequence --创建sequenceCREATE SEQUENCE emp_sequence      INCREMENT BY 1  -- 每次加几个      START WITH 1  ...

  4. MFC中函数名前加 :: 原因

    在开发MFC之前,开发的是以AFx(Application Frameworks,x是没有什么意义的)开头的一些函数.但是那个时候开发的函数并没有进行封装,但是有很多很有用的函数.最后AFx开发失败, ...

  5. GTD:是一种态度

    时间管理发展的四个阶段: 第一代理论着重利用便条与备忘录,在忙碌中调配时间与精力: 第二代理论强调行事历与日程表,反映出时间管理已注意到规划未来的重要: 第三代理论正是目前流行的优先级观念.也就是依据 ...

  6. 百度UEditor编辑器关闭抓取远程图片功能(默认开启)

    这个坑娘的功能,开始时居然不知道如何触发,以为有个按钮,点击一下触发,翻阅了文档,没有发现,然后再网络上看到原来是复制粘贴非白名单内的图片到编辑框时触发,坑娘啊............... 问题又来 ...

  7. CSS定义网页滚动条

    (一)滚动条样式主要涉及到如下CSS属性: overflow属性: 检索或设置当对象的内容超过其指定高度及宽度时如何显示内容overflow: auto; 在需要时内容会自动添加滚动条overflow ...

  8. Manasa and Stones

    from __future__ import print_function def main(): t = int(raw_input()) for _ in range(t): n = int(ra ...

  9. 分布式批处理平台(wolf)简介

    "wolf"即狼,狼的适应性很强.可栖息范围包括苔原.草原.森林.荒漠.农田等多种生境:具有敏锐的观察力.专一的目标.默契的配合,它们总能依靠团体的力量达成目标. 分布式批处理平台 ...

  10. 转载--http协议学习和总结

    http的了解一直停留在一知半解的程度,今天看到阿蜜果大大的博客,果断学习了,这里做个转载,希望阿蜜果大大不要怪罪~~ 3.1 Cookie和Session Cookie和Session都为了用来保存 ...