Angular2 PrimeNG源码学习
Paginator分页组件
GITHUB地址
首先分析一下分页功能的需求:
- 由父组件传入数据总数量,每页显示数量,可自定义初始页
- 由父组件传入分页按钮个数
- 有第一页,上一页,下一页,最后一页按钮
- 可在页面选择性更改每页显示数量
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() "> <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);
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?