Angular2 PrimeNG分页模块学习


Posted in Javascript onJanuary 14, 2017

Angular2 PrimeNG源码学习

Paginator分页组件

GITHUB地址

首先分析一下分页功能的需求:

  1. 由父组件传入数据总数量,每页显示数量,可自定义初始页
  2. 由父组件传入分页按钮个数
  3. 有第一页,上一页,下一页,最后一页按钮
  4. 可在页面选择性更改每页显示数量

HTML模板代码:
部分代码片段

第一页按钮:

 <a href="#" #firstlink class="ui-paginator-first ui-paginator-element ui-state-default ui-corner-all" (mouseenter)="hoveredItem = $event.target" (mouseleave)="hoveredItem = null" (click)="changePageToFirst($event)" [ngClass]="{'ui-state-disabled':isFirstPage(), 'ui-state-hover':(firstlink === hoveredItem && !isFirstPage())}" [tabindex]="isFirstPage() ? -1 : null"> <span class="fa fa-step-backward"></span> </a> 

这段代码涉及几个事件。
1.鼠标移入移出更改hoveredItem变量,并以此更改样式
2.点击click事件,调用changePageToFirst(event)处理

上一页,下一页,最后一页和第一页类似

分页按钮:

<span class="ui-paginator-pages">

     <a href="#" #plink *ngFor="let pageLink of pageLinks" class="ui-paginator-page ui-paginator-element ui-state-default ui-corner-all"(mouseenter)="hoveredItem = $event.target" (mouseleave)="hoveredItem = null" (click)="changePage(pageLink - 1, $event)"

     [ngClass]="{'ui-state-hover':(plink === hoveredItem), 'ui-state-active': (pageLink-1 == getPage())}">{{pageLink}}

     </a>

 </span>
 

分页按钮是通过*ngFor从分页按钮数组中循环出来的,所以我们需要去确定这个数组

下面处理数组,和各个按钮的事件

//每页显示条目,默认0
@Input() rows: number = 0;
//显示分页按钮数量,默认5
@Input() pageLinkSize: number = 5;
//点击按钮后向父组件发送事件
@Output() onPageChange: EventEmitter<any> = new EventEmitter();
//调整每页显示条目数量的下拉菜单
@Input() rowsPerPageOptions: number[];
//定义分页按钮
pageLinks: number[];
_totalRecords: number = 0;
_first: number = 0;
//数据总数
@Input() get totalRecords(): number {
 return this._totalRecords;
}
set totalRecords(val: number) {
 this._totalRecords = val;
 this.updatePageLinks();
}
//高亮按钮位置
@Input() get first(): number {
 return this._first;
}
set first(val: number) {
 this._first = val;
 this.updatePageLinks();
}
//获取一共多少页
getPageCount() {
 return Math.ceil(this.totalRecords / this.rows) || 1;
}

//获取当前页,0为第一页
getPage(): number {
 return Math.floor(this.first / this.rows);
}

//是否为第一页
isFirstPage(): boolean {
 return this.getPage() === 0;
}

//是否为最后一页
isLastPage(): boolean {
 return this.getPage() === this.getPageCount() - 1;
}
//确定当先需要显示的起始分页和结束分页
calculatePageLinkBoundaries() {
 let numberOfPages = this.getPageCount();
 let visiblePages = Math.min(this.pageLinkSize, numberOfPages);
 let start = Math.max(0, Math.ceil(this.getPage() - (visiblePages / 2)));
 let end = Math.min(numberOfPages - 1, start + visiblePages - 1);

 const delta = this.pageLinkSize - (end - start + 1);
 start = Math.max(0, start - delta);
 return [start, end];
}

//更新需要显示的分页条目
updatePageLinks(): void {
 this.pageLinks = [];
 let boundaries = this.calculatePageLinkBoundaries;
 const start = boundaries[0];
 const end = boundaries[1];
 for (let i = start; i <= end; i++) {
  this.pageLinks.push(i + 1);
 }
}

//点击分页
changePage(p: number, event) {
 var pageCount = this.getPageCount();
 if (p > 0 && p < pageCount) {
  this.first = this.rows * p;
  const state = {
   page: p,
   first: this.first,
   rows: this.rows,
   pageCount: pageCount
  };
  this.updatePageLinks();

  this.onPageChange.emit(state);
 }
 if (event) {
  event.preventDefault();
 }
}
//第一页
changePageToFirst(event){
 this.changePage(0,event);
}

//上一页
changePageToPrev(event){
 this.changePage(this.getPage() - 1,event);
}

//下一页
changePageToNext(event){
 this.changePage(this.getPage() + 1,event);
}

//最后一页
changePageToLast(event){
 this.changePage(this.getPageCount() - 1,event);
}

//通过下拉菜单更改每页显示数量
onRppChange(event){
 this.rows = this.rowsPerPageOptions[event.target.selectedIndex];
 this.changePageToFirst(event);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
农历与西历对照
Sep 06 Javascript
cloudgamer出品ImageZoom 图片放大效果
Apr 01 Javascript
js利用与或运算符优先级实现if else条件判断表达式
Apr 15 Javascript
js 延迟加载 改变JS的位置加快网页加载速度
Dec 11 Javascript
jquery的attr方法禁用表单元素禁用输入内容
Jun 23 Javascript
网页收藏夹显示ICO图标(代码少)
Aug 04 Javascript
thinkjs之页面跳转同步异步操作
Feb 05 Javascript
使用react-router4.0实现重定向和404功能的方法
Aug 28 Javascript
layui原生表单验证的实例
Sep 09 Javascript
Node.js操作MongoDB数据库实例分析
Jan 19 Javascript
Vue在H5 项目中使用融云进行实时个人单聊通讯
Dec 14 Vue.js
Vue接口封装的完整步骤记录
May 14 Vue.js
bootstrap datetimepicker日期插件使用方法
Jan 13 #Javascript
详解jQuery事件
Jan 13 #Javascript
js实现固定宽高滑动轮播图效果
Jan 13 #Javascript
JavaScript利用闭包实现模块化
Jan 13 #Javascript
Vue.js基础知识小结
Jan 13 #Javascript
canvas实现流星雨的背景效果
Jan 13 #Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
Jan 13 #Javascript
You might like
从PHP $_SERVER相关参数判断是否支持Rewrite模块
2013/09/26 PHP
typecho插件编写教程(四):插件挂载
2015/05/28 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
PHP通过get方法获得form表单数据方法总结
2018/09/12 PHP
javascript实现复制与粘贴操作实例
2014/10/16 Javascript
Javascript解析URL方法详解
2014/12/05 Javascript
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
JavaScript中的toUTCString()方法使用详解
2015/06/12 Javascript
AngularJS转换响应内容
2016/01/27 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
JS实现鼠标滑过显示边框的菜单效果
2016/09/21 Javascript
Node.js批量给图片加水印的方法
2016/11/15 Javascript
js实现下一页页码效果
2017/03/07 Javascript
解决ie img标签内存泄漏的问题
2017/10/13 Javascript
简单两步使用node发送qq邮件的方法
2019/03/01 Javascript
原生js+canvas实现验证码
2020/11/29 Javascript
[49:54]Ti4 循环赛第三日 LGD vs Titan
2014/07/12 DOTA
[02:21]2018完美盛典章节片——初心
2018/12/17 DOTA
Python多进程并发(multiprocessing)用法实例详解
2015/06/02 Python
python 实现手机自动拨打电话的方法(通话压力测试)
2019/08/08 Python
基于Django统计博客文章阅读量
2019/10/29 Python
将数据集制作成VOC数据集格式的实例
2020/02/17 Python
OpenCV Python实现拼图小游戏
2020/03/23 Python
python中sympy库求常微分方程的用法
2020/04/28 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
2020/05/20 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
2020/09/23 Python
python+playwright微软自动化工具的使用
2021/02/02 Python
用python 绘制茎叶图和复合饼图
2021/02/26 Python
马来西亚在线健康商店:Medipal Malaysia
2020/04/13 全球购物
PHP面试题集
2016/12/18 面试题
什么是索引指示器
2012/08/20 面试题
2013年入党人员的自我鉴定
2013/10/25 职场文书
小学生环保标语
2014/06/13 职场文书
助残日活动总结
2014/08/27 职场文书
如何理解Vue简单状态管理之store模式
2021/05/15 Vue.js
Vue2项目中对百度地图的封装使用详解
2022/06/16 Vue.js