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之水平横向滚动歌词同步的应用
May 07 Javascript
网页中表单按回车就自动提交的问题的解决方案
Nov 03 Javascript
jQuery中children()方法用法实例
Jan 07 Javascript
javascript学习指南之回调问题
Apr 23 Javascript
jquery日历插件e-calendar升级版
Nov 10 Javascript
Javascript使用uploadify来实现多文件上传
Nov 16 Javascript
vue2.0多条件搜索组件使用详解
Mar 26 Javascript
激动人心的 Angular HttpClient的源码解析
Jul 10 Javascript
在vue中实现简单页面逆传值的方法
Nov 27 Javascript
egg.js的基本使用和调用数据库的方法示例
May 18 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
Feb 03 Javascript
通过实例解析jQ Ajax操作相关原理
Sep 23 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
php下利用curl判断远程文件是否存在的实现代码
2011/10/08 PHP
在PHP中使用X-SendFile头让文件下载更快
2014/06/01 PHP
ThinkPHP数据操作方法总结
2015/09/28 PHP
php从身份证获取性别和出生年月
2017/02/09 PHP
动态加载iframe
2006/06/16 Javascript
js 小数取整的函数
2010/05/10 Javascript
jquery实现居中弹出层代码
2010/08/25 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
2015/01/09 Javascript
jquery搜索框效果实现方法
2015/01/16 Javascript
JavaScript中的分号插入机制详细介绍
2015/02/11 Javascript
PHP 数组current和next用法分享
2015/03/05 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
2016/01/05 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
2016/10/10 Javascript
使用JavaScript解决网页图片拉伸问题(推荐)
2016/11/25 Javascript
微信小程序 商城开发(ecshop )简单实例
2017/04/07 Javascript
AngularJS读取JSON及XML文件的方法示例
2017/05/25 Javascript
layer.confirm取消按钮绑定事件的方法
2018/08/17 Javascript
angular学习之动态创建表单的方法
2018/12/07 Javascript
JS开发 富文本编辑器TinyMCE详解
2019/07/19 Javascript
Python中的字典遍历备忘
2015/01/17 Python
使用IronPython把Python脚本集成到.NET程序中的教程
2015/03/31 Python
Python查找两个有序列表中位数的方法【基于归并算法】
2018/04/20 Python
python scp 批量同步文件的实现方法
2019/01/03 Python
在django中图片上传的格式校验及大小方法
2019/07/28 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
2019/10/18 Python
基于python实现数组格式参数加密计算
2020/04/21 Python
Python基于jieba, wordcloud库生成中文词云
2020/05/13 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
Scrapy实现模拟登录的示例代码
2021/02/21 Python
企业道德讲堂实施方案
2014/03/19 职场文书
《鹬蚌相争》教学反思
2014/04/22 职场文书
技校毕业生自荐信
2014/06/03 职场文书
暑假安全保证书
2015/02/28 职场文书
合同补充协议书
2016/03/24 职场文书
使用CSS实现黑白格背景效果
2022/06/01 HTML / CSS