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 相关文章推荐
ExtJs中简单的登录界面制作方法
Aug 19 Javascript
浏览器页面区域大小的js获取方法
Sep 21 Javascript
JS获取键盘上任意按键的值(实例代码)
Nov 12 Javascript
JavaScript和JQuery的鼠标mouse事件冒泡处理
Jun 19 Javascript
JQuery实现左右滚动菜单特效
Sep 28 Javascript
Javascript计算二维数组重复值示例代码
Dec 18 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
Mar 11 Javascript
vue.js 嵌套循环、if判断、动态删除的实例
Mar 07 Javascript
js 根据对象数组中的属性进行排序实现代码
Sep 12 Javascript
详解简单易懂的 ES6 Iterators 指南和示例
Sep 24 Javascript
详解小程序如何改变onLoad的执行时机
Nov 01 Javascript
vue-cli4.0多环境配置变量与模式详解
Dec 30 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下常用正则表达式整理
2010/10/26 PHP
与文件上传有关的php配置参数总结
2013/06/14 PHP
php三维数组去重(示例代码)
2013/11/26 PHP
浅析PHP程序设计中的MVC编程思想
2014/07/28 PHP
在Mac上编译安装PHP7的开发环境
2015/07/28 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
2017/06/19 PHP
laravel接管Dingo-api和默认的错误处理方式
2019/10/25 PHP
PHP 99乘法表的几种实现代码
2020/10/13 PHP
一个小例子解释如何来阻止Jquery事件冒泡
2014/07/17 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
2014/11/08 Javascript
js中substr,substring,indexOf,lastIndexOf,split,replace的用法详解
2015/11/09 Javascript
JQuery导航菜单选择特效
2016/04/11 Javascript
基于vue.js无缝滚动效果
2018/01/25 Javascript
浅谈Vue2.0中v-for迭代语法的变化(key、index)
2018/03/06 Javascript
vue 实现的树形菜的实例代码
2018/03/19 Javascript
Vue动画事件详解及过渡动画实例
2019/02/09 Javascript
JS中队列和双端队列实现及应用详解
2020/09/29 Javascript
python读取json文件并将数据插入到mongodb的方法
2015/03/23 Python
python使用sorted函数对列表进行排序的方法
2015/04/04 Python
python清除字符串里非数字字符的方法
2015/07/02 Python
梯度下降法介绍及利用Python实现的方法示例
2017/07/12 Python
python决策树之CART分类回归树详解
2017/12/20 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
2020/02/18 Python
Django单元测试中Fixtures用法详解
2020/02/25 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
2020/03/06 Python
聊聊python在linux下与windows下导入模块的区别说明
2021/03/03 Python
Sneaker Studio法国:购买运动鞋
2018/06/08 全球购物
No7 Beauty美国官网:英国国民护肤品牌
2019/10/31 全球购物
建筑工程技术应届生自荐信
2013/09/27 职场文书
员工自我鉴定范文
2013/10/06 职场文书
物业管理应届生求职信
2013/10/28 职场文书
社区党员先进事迹
2014/01/22 职场文书
暗恋桃花源观后感
2015/06/12 职场文书
《月球之谜》教学反思
2016/02/20 职场文书
世界上超棒的8种逻辑思维
2019/08/06 职场文书
《刺客之王:C罗全景传记》:时代从来不会亏待手艺人
2019/11/28 职场文书