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实现信息的显示和隐藏如注册页面
Dec 03 Javascript
jQuery判断数组是否包含了指定的元素
Mar 10 Javascript
JS HTML5实现拖拽移动列表效果
Aug 27 Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
Oct 14 Javascript
js实现表单提交后不重新刷新当前页面
Nov 30 Javascript
原生js实现弹出层效果
Jan 20 Javascript
jQuery点击导航栏选中更换样式的实现代码
Jan 23 Javascript
JQuery和html+css实现带小圆点和左右按钮的轮播图实例
Jul 22 jQuery
JavaScript实现获取select下拉框中第一个值的方法
Feb 06 Javascript
Vue2.5通过json文件读取数据的方法
Feb 27 Javascript
Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示
Jun 26 Javascript
jQuery模仿ToDoList实现简单的待办事项列表
Dec 30 jQuery
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+jQuery 注册模块开发详解
2014/10/14 PHP
PHP之sprintf函数用法详解
2014/11/12 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
2019/08/09 PHP
Javascript操纵Cookie实现购物车程序
2007/02/15 Javascript
基于jquery的分页控件(C#)
2011/01/06 Javascript
js判断FCKeditor内容是否为空的两种形式
2013/05/14 Javascript
setTimeout自动触发一个js的方法
2014/01/15 Javascript
js中创建对象的几种方式示例介绍
2014/01/26 Javascript
js加入收藏夹代码(兼容ie/ff/op)
2014/05/16 Javascript
jquery attr方法获取input的checked属性问题
2014/05/26 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
2014/06/19 Javascript
js数组常见操作及数组与字符串相互转化实例详解
2015/11/10 Javascript
jQuery Validate初步体验(一)
2015/12/12 Javascript
JS弹出对话框实现方法(三种方式)
2015/12/18 Javascript
在Docker快速部署Node.js应用的详细步骤
2016/09/02 Javascript
微信小程序--组件(swiper)详细介绍
2017/06/13 Javascript
基于Vue框架vux组件库实现上拉刷新功能
2017/11/28 Javascript
微信小程序 调用微信授权窗口相关问题解决
2019/07/25 Javascript
javascript前端和后台进行数据交互方法示例
2020/08/07 Javascript
python里大整数相乘相关技巧指南
2014/09/12 Python
Python实现将sqlite数据库导出转成Excel(xls)表的方法
2017/07/17 Python
Python批量合并有合并单元格的Excel文件详解
2018/04/05 Python
python处理“
2019/06/10 Python
Tensorflow模型实现预测或识别单张图片
2019/07/19 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
2019/10/12 Python
python脚本后台执行方式
2019/12/21 Python
Python实现i人事自动打卡的示例代码
2020/01/09 Python
俄罗斯品牌服装和鞋子在线商店:BRIONITY
2020/03/26 全球购物
名企HR怎样看待求职信
2014/02/23 职场文书
医院合作协议书
2014/08/19 职场文书
先进学校事迹材料
2014/12/30 职场文书
销售开票员岗位职责
2015/04/15 职场文书
2015年法务工作总结范文
2015/05/23 职场文书
签证工作证明模板
2015/06/15 职场文书
MySQL8.0的WITH查询详情
2021/08/30 MySQL
CentOS7和8下安装Maven3.8.4
2022/04/07 Servers