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 相关文章推荐
jquery 表单取值常用代码
Dec 22 Javascript
JS localStorage实现本地缓存的方法
Jun 22 Javascript
JavaScript中对象property的删除方法介绍
Dec 30 Javascript
JavaScript事件委托技术实例分析
Feb 06 Javascript
js实现文件上传表单域美化特效
Nov 02 Javascript
JS实现网页上随机产生超链接地址的方法
Nov 09 Javascript
JavaScript中ES6 Babel正确安装过程
Jul 18 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
May 16 Javascript
Vue使用mixin分发组件的可复用功能
Sep 01 Javascript
vue不操作dom实现图片轮播的示例代码
Dec 18 Javascript
全面解析JavaScript Module模式
Jul 24 Javascript
vue中三级导航的菜单权限控制
Mar 31 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写的采集程序
2007/03/16 PHP
php 全局变量范围分析
2009/08/07 PHP
PHP创建桌面快捷方式的实例代码
2014/02/17 PHP
php语言中使用json的技巧及json的实现代码详解
2015/10/27 PHP
CodeIgniter控制器之业务逻辑实例分析
2016/01/20 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
2018/05/10 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
2019/10/16 PHP
写js时遇到的一些小问题
2010/12/06 Javascript
Jquery结合HTML5实现文件上传
2015/06/25 Javascript
JS实现不使用图片仿Windows右键菜单效果代码
2015/10/22 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
2015/11/22 Javascript
angularJs关于指令的一些冷门属性详解
2016/10/24 Javascript
JS比较两个数值的大小实例
2016/11/25 Javascript
NodeJS测试框架mocha入门教程
2017/03/28 NodeJs
JavaScript数组去重的多种方法(四种)
2017/09/19 Javascript
初探js和简单隐藏效果的实例
2017/11/23 Javascript
JS实现点击复选框变更DIV显示状态的示例代码
2017/12/18 Javascript
node跨域转发 express+http-proxy-middleware的使用
2018/05/31 Javascript
layui使用及简单的三级联动实现教程
2020/12/01 Javascript
简单掌握Python中glob模块查找文件路径的用法
2016/07/05 Python
python实现发送邮件及附件功能
2021/03/02 Python
Python编程实现控制cmd命令行显示颜色的方法示例
2017/08/14 Python
Python数据结构与算法之图结构(Graph)实例分析
2017/09/05 Python
python 爬虫 批量获取代理ip的实例代码
2018/05/22 Python
详解python3中zipfile模块用法
2018/06/18 Python
pygame游戏之旅 添加键盘按键的方法
2018/11/20 Python
Python Pandas 转换unix时间戳方式
2019/12/07 Python
python十进制转二进制的详解
2020/02/07 Python
python通过对字典的排序,对json字段进行排序的实例
2020/02/27 Python
python thrift 实现 单端口多服务的过程
2020/06/08 Python
优秀员工表扬信
2014/01/17 职场文书
初中学生评语大全
2014/04/24 职场文书
演讲稿格式范文
2014/05/19 职场文书
2015幼儿园新学期寄语
2015/02/27 职场文书
2019年教师节活动策划方案
2019/09/09 职场文书
python opencv检测直线 cv2.HoughLinesP的实现
2021/06/18 Python