(首先声明本文来自博客园本人原创,转载请说明出处。欢迎关注:http://www.cnblogs.com/mazhaokeng/p/6752990.html)

  之前网站的后台管理为了图快,把Jquery写的前台页面使用的分页插件,套到Angular中使用。现在后台的小编说这东西有时候翻页失败,而插件代码十分复杂,无法定位bug进行修改,也无法保证修改后不会出现别的bug,干脆舍弃插件,自己写一个。

  设计时,我大概看了一下插件的代码,基本思路就是通过数据处理判断,然后通过字符串拼接,生成新的dom元素。而我们需要的分页是在Angular中运行,应当尽量避免这种做法。怎么简单怎么来,我们固定一次只显示7个页码,不需要动态增删元素。

  <ul>
<li ng-repeat="num in pageShowList">
<a href="javascript:void(0)">
{{num}}
</a>
</li>
</ul>

  pageShowList是要显示的7个页码,元素是固定的,但里面的数字会变化。我们把这7个页码设计成一个“展示窗口”,用于展示“全部页码”的一部分。在页码被点击时会移动,然后把点击的页码放到中间,这就是我们想要的效果。假如我们总共有12页,初始化时我们显示的是1-7页。

  总页数:    1   2   3   4   5   6   7   8   9   10   11   12

  展示窗口: 1   2   3   4   5   6   7

  这总页数和展示都需要生成一个数组。首先总页数生成很简单,从1开始到最大页数位置push数字进去就行了。

        /*  设定最大页数
* */
function setPageMax(num) {
maxPage = num;            //保存最大页数
for (var i = 1; i <= num; i++) {
pageList.push(i);        //生成数组
}
$scope.pageShowList = pageList.slice(0, 7); //显示窗口数组,只显总页数中的其中7个
}

  这样就生成了我们需要的页码。接下来是点击时窗口的移动。

  

  我们为页码的a标签绑定一个点击事件,ng-click="pageGo(num)",num就是窗口中的数字。点击事件pageGo需要调用下面的代码重新排列显示的页码:

     /*  重新设置页码
* */
function resetPageOrder(num) {
      if( num > 4 ){
         $scope.pageShowList = [  //重新排列窗口的
num - 3,
num - 2,
num - 1,
num,
num + 1,
num + 2,
num + 3
];
      }else{
        $scope.pageShowList = pageList.slice(0, 7);  //显示1-7
      }
    }

  思路很简单,就是点击不超过显示窗口中点的数字1-4时,窗口不移动(没有小于1的页数),而点击大于4的数字时,比如5,我们就把5放窗口中间,它的分别两边就是2、3、4和6、7、8。我们依次递增点击页码,窗口就往右移动了。

  总页数:    1   2   3   4   5   6   7   8   9   10   11   12

  展示窗口:      2   3   4   5   6   7   8

  展示窗口:           3   4   5   6   7   8   9

  

  然后我们发现,当点击页码越来越大,很快窗口右边就会超出总页数。这时我们只要把超出的部分去除掉就可以了。对展示窗口数组的处理就是把大于总页数12的元素pop掉。

  总页数:    1   2   3   4   5   6   7   8   9   10   11   12

  展示窗口:                                   8   9   10   11   12   13

  展示窗口:                                        9   10   11   12   13  14

        /*  重新设置页码
* */
function resetPageOrder(num) {if (num > 4 ) {
$scope.pageShowList = [  
num - 3,
num - 2,
num - 1,
num,
num + 1,
num + 2,
num + 3
];
if ( num > maxPage - 3 ){      //窗口中点右边长度为3,如果超出了总页数
for ( var i = 0; i < 3-(maxPage - num); i ++ ){  //根据超出长度的个数,把显示窗口数组右边pop掉。
$scope.pageShowList.pop();
}
}
} else{ //
$scope.pageShowList = pageList.slice(0, 7); //1-7
}
}

  这样就得到我们想要的效果:

  

  

  最后总结一下,程序的思想就是,把要全部的页码生成出来,再制作一个与html绑定的展示窗口显示全部页码的一部分,点击时把点击的页码放在窗口的中间。窗口移动的过程中会遇到下面的三种情况:

  (1)点击页码小于窗口中点,此时窗口不移动。

  (2)点击页码大于窗口中点,窗口往右移动。

  (3)窗口右边超出总页数,此时需要把超出部分剔除掉。

  经过进一步的美化加工,就可以达到下面的效果了。我认为我们不能一遇上比较困难的逻辑时,就想要找各种插件。能不能自己思考一下,用简单的方法实现,再在此基础上进行加强,这才是程序员的核心能力。想要成为大牛,肯定不能只停留在使用轮子的阶段,轮子太复杂,我们就造一个小的用着先嘛。

  

  最终代码整理:

//变量
var pageList = [];
$scope.page = 1; //初始默认为第一页
$scope.pageShowList = []; //最大显示7个格子 /* 监听最大页数,如果页数变化,重新生成页数数组
* */
var watch = $scope.$watch('maxPage', function (newValue, oldValue, scope) {
pageList = [];
for (var i = 1; i <= newValue; i++) { //一个个压入页码
pageList.push(i);
}
resetPageOrder($scope.page);
}); /* 直接跳页
* */
$scope.pageGo = function (num) {
$scope.page = num;
resetPageOrder($scope.page);
}; /* 上一页
* */
$scope.pagePre = function () {
if( $scope.page > 1){
$scope.page --;
resetPageOrder($scope.page);
}
}; /* 下一页
* */
$scope.pageNext = function () {
if ( $scope.page < $scope.maxPage ){
$scope.page ++;
resetPageOrder($scope.page);
}
}; /* 重新设置页码
* @param num当前页码
* */
function resetPageOrder(num) {
$scope.clickPage = num; //变色
if (num > 4 ) {
$scope.pageShowList = [
num - 3,
num - 2,
num - 1,
num,
num + 1,
num + 2,
num + 3
];
if ( num > $scope.maxPage - 3 ){ //去除多出的页数
for ( var i = 0; i < 3-($scope.maxPage - num); i ++ ){
$scope.pageShowList.pop();
}
}
} else{ //点击小于4的页数
$scope.pageShowList = pageList.slice(0, 7); //只显示最大7个
}
}

Angular简易分页设计(一):基本功能实现的更多相关文章

  1. Angular简易分页设计(二):封装成指令

    (首先声明本文来自博客园本人原创,转载请说明出处.欢迎关注:http://www.cnblogs.com/mazhaokeng/) 之前我们讲过,Angular分页代码确实不难实现,但是由于在多个路由 ...

  2. Java 开源办公开发平台 O2OA V5.4.0 发布 | 设计元素搜索功能上线

    O2OA V5.4.0版本此次更新的设计元素搜索功能,可以让用户在海量的脚本.页面.表单.视图等信息中迅速锁定有价值的信息,以便提高用户获取信息的效率.拥有此搜索功能后,在开发过程中,可以加速定位脚本 ...

  3. Winform开发框架之简易工作流设计(转自 伍华聪博客)

    Winform开发框架之简易工作流设计 一讲到工作流,很多人第一反应就是这个东西很深奥,有时候又觉得离我们较为遥远,确实完善的工作流设计很多方面,而正是由于需要兼顾很多方面,一般通用的工作流都难做到尽 ...

  4. angular.js分页代码的实例

    对于大多数web应用来说显示项目列表是一种很常见的任务.通常情况下,我们的数据会比较多,无法很好地显示在单个页面中.在这种情况下,我们需要把数据以页的方式来展示,同时带有转到上一页和下一页的功能.现在 ...

  5. Angular pagination分页模块 只提供分页参数处理 不处理分页记录数据

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Angular应用架构设计-3:Ngrx Store

    这是有关Angular应用架构设计系列文章中的一篇,在这个系列当中,我会结合这近两年中对Angular.Ionic.甚至Vuejs等框架的使用经验,总结在应用设计和开发过程中遇到的问题.和总结的经验, ...

  7. 审核流(2)流程设计-SNF.WorkFlow功能使用说明--SNF快速开发平台3.1

    流程设计 图形化的流程设计,更方便.直观 1.打开“流程设计“程序,如上.点击”新建“如下: 2.红色部分为必填项,审批对象是选择要审批的程序菜单,单据名称是在审核流流转时用于提示的单据名称,还要选择 ...

  8. 什么是需求Bug、设计Bug、功能bug?

    首先什么是需求Bug.设计Bug.功能bug? 需求Bug,指由于客户需求描述不清晰或错误.需求收集人员自身原因及需求本身模糊难于分析.获取等原因,导致客户需求获取不准确,后期产品不能满足客户.用户的 ...

  9. 左键双击关闭pagecontrol中的一个分页即一个tabsheet,功能像遨游浏览器一样

    左键双击关闭pagecontrol中的一个分页即一个tabsheet,功能像遨游浏览器一样 procedure TfrmServerSetup.PageControl1MouseDown(Sender ...

随机推荐

  1. java基础之基础语法详录(一)

    [前言] java的语法先从基础语法学,Java语言是由类和对象组成的,其对象和类又是由方法和变量组成,而方法,又包含了语句和表达式. 对象:(几乎)一切都是对象,比如:一只熊猫,他的外观,颜色,他在 ...

  2. HTTP协议分析

    一.域名概述 1.域名解析的作用: 主机数量增多时,IP地址不容易记忆,域名方便记忆.域名记忆更加直观. 2.hosts文件 早期通过hosts文件进行域名的解析,Linux系统中hosts文件存放路 ...

  3. 实际比较filter2D和imfilter之间的关系

    实际比较filter2D和imfilter之间的关系 ​                  卷积运算是图像处理和增强中经常遇到的一种算法.由于很多优秀的开源算法都是采用matlab编写的,在我改写为c ...

  4. CCNA网络工程师学习进程(10)NAT的配置

     NAT(Network Address Translation,网络地址转换)是将IP 数据包头中的IP 地址转换为另一个IP 地址的过程.     (1)NAT简介:     在实际应用中,NAT ...

  5. 当Node.js遇见Docker

    Node.js Best Practices - How to Become a Better Developer in 2017提到的几点,我们Fundebug深有同感: 使用ES6 使用Promi ...

  6. Alamofire源码解读系列(十)之序列化(ResponseSerialization)

    本篇主要讲解Alamofire中如何把服务器返回的数据序列化 前言 和前边的文章不同, 在这一篇中,我想从程序的设计层次上解读ResponseSerialization这个文件.更直观的去探讨该功能是 ...

  7. 【2017-03-31】JS-DOM操作:操作属性、彩虹导航栏、定时器、操作内容、创建元素并添加、操作相关元素

    一.操作属性 1.什么是属性: <div class="div" id="div1" style="" ></div> ...

  8. 函数调用过程&生成器解释

    摘自马哥解答,感谢. 函数调用过程: 假设程序是单进程,单执行流,在某一时刻,能运行的程序流只能有一个.但函数调用会打开新的执行上下文,因此,为了确保main函数可以恢复现场,在main函数调用其它函 ...

  9. Linux下搭建mpi集群(ubuntu下用虚拟机测试)

    一 建立SSH连接(无密码登陆) 1 SSH连接的简单介绍 SSH 为 Secure Shell 的缩写,中文翻译为安全外壳协议,建立在应用层,是一种远程连接安全协议.传统的telnet,pop,ft ...

  10. 浅谈HTTP中Get与Post的区别[转载]

    Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP ...