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 相关文章推荐
javascript编程起步(第六课)
Feb 27 Javascript
20个非常有用的PHP类库 加速php开发
Jan 15 Javascript
Jquery实现的tab效果可以指定默认显示第几页
Oct 16 Javascript
jquery中ajax处理跨域的三大方式
Jan 05 Javascript
详解Sea.js中Module.exports和exports的区别
Feb 12 Javascript
Vue实现内部组件轮播切换效果的示例代码
Apr 07 Javascript
结合Vue控制字符和字节的显示个数的示例
May 17 Javascript
vue2.0项目实现路由跳转的方法详解
Jun 21 Javascript
详解从Vue-router到html5的pushState
Jul 21 Javascript
基于VUE实现的九宫格抽奖功能
Sep 30 Javascript
js实现图片放大并跟随鼠标移动特效
Jan 18 Javascript
vue.js实现备忘录demo
Jun 26 Javascript
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
phpmyadmin操作流程
2006/10/09 PHP
PHP模拟SQL Server的两个日期处理函数
2006/10/09 PHP
PHP程序员最常犯的11个MySQL错误小结
2010/11/20 PHP
php生成数组的使用示例 php全组合算法
2014/01/16 PHP
javascript 解决表单仍然提交即使监听处理函数返回false
2010/03/14 Javascript
JavaScript 类的定义和引用 JavaScript高级培训 自定义对象
2010/04/27 Javascript
下载文件个别浏览器文件名乱码解决办法
2013/03/19 Javascript
js 调用父窗口的具体实现代码
2013/07/15 Javascript
[JSF]使用DataModel处理表行事件的实例代码
2013/08/05 Javascript
javascript实现百度地图鼠标滑动事件显示、隐藏
2015/04/02 Javascript
javascript制作的滑动图片菜单
2015/05/15 Javascript
jQuery实现表单步骤流程导航代码分享
2015/08/28 Javascript
JS中判断null的方法分析
2016/11/21 Javascript
微信小程序实现表单校验功能
2020/03/30 Javascript
快速搭建vue2.0+boostrap项目的方法
2018/04/09 Javascript
webstorm中vue语法的支持详解
2018/05/09 Javascript
详解Vue中使用Echarts的两种方式
2018/07/03 Javascript
vue实现多条件和模糊搜索功能
2019/05/28 Javascript
Vue2.0 ES6语法降级ES5的操作
2020/10/30 Javascript
[10:54]Team Spirit vs Navi
2018/06/07 DOTA
Python群发邮件实例代码
2014/01/03 Python
django使用图片延时加载引起后台404错误
2017/04/18 Python
用pyqt5 给按钮设置图标和css样式的方法
2019/06/24 Python
Django使用Channels实现WebSocket的方法
2019/07/28 Python
树莓派极简安装OpenCv的方法步骤
2019/10/10 Python
Windows下python3安装tkinter的问题及解决方法
2020/01/06 Python
python中upper是做什么用的
2020/07/20 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
python的数学算法函数及公式用法
2020/11/18 Python
性能服装:HYLETE
2018/08/14 全球购物
民政局副局长民主生活会个人整改措施
2014/10/04 职场文书
2015感人爱情寄语
2015/02/26 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
Nginx+Tomcat实现负载均衡、动静分离的原理解析
2021/03/31 Servers
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL
解析Java异步之call future
2021/06/14 Java/Android