Angular2 PrimeNG分页模块学习
Angular2PrimeNG源码学习
Paginator分页组件
GITHUB地址
首先分析一下分页功能的需求:
- 由父组件传入数据总数量,每页显示数量,可自定义初始页
- 由父组件传入分页按钮个数
- 有第一页,上一页,下一页,最后一页按钮
- 可在页面选择性更改每页显示数量
HTML模板代码:
部分代码片段
第一页按钮:
<ahref="#"#firstlinkclass="ui-paginator-firstui-paginator-elementui-state-defaultui-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"> <spanclass="fafa-step-backward"></span> </a>
这段代码涉及几个事件。
1.鼠标移入移出更改hoveredItem变量,并以此更改样式
2.点击click事件,调用changePageToFirst(event)处理
上一页,下一页,最后一页和第一页类似
分页按钮:
<spanclass="ui-paginator-pages"> <ahref="#"#plink*ngFor="letpageLinkofpageLinks"class="ui-paginator-pageui-paginator-elementui-state-defaultui-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>=newEventEmitter(); //调整每页显示条目数量的下拉菜单 @Input()rowsPerPageOptions:number[]; //定义分页按钮 pageLinks:number[]; _totalRecords:number=0; _first:number=0; //数据总数 @Input()gettotalRecords():number{ returnthis._totalRecords; } settotalRecords(val:number){ this._totalRecords=val; this.updatePageLinks(); } //高亮按钮位置 @Input()getfirst():number{ returnthis._first; } setfirst(val:number){ this._first=val; this.updatePageLinks(); }
//获取一共多少页 getPageCount(){ returnMath.ceil(this.totalRecords/this.rows)||1; } //获取当前页,0为第一页 getPage():number{ returnMath.floor(this.first/this.rows); } //是否为第一页 isFirstPage():boolean{ returnthis.getPage()===0; } //是否为最后一页 isLastPage():boolean{ returnthis.getPage()===this.getPageCount()-1; }
//确定当先需要显示的起始分页和结束分页 calculatePageLinkBoundaries(){ letnumberOfPages=this.getPageCount(); letvisiblePages=Math.min(this.pageLinkSize,numberOfPages); letstart=Math.max(0,Math.ceil(this.getPage()-(visiblePages/2))); letend=Math.min(numberOfPages-1,start+visiblePages-1); constdelta=this.pageLinkSize-(end-start+1); start=Math.max(0,start-delta); return[start,end]; } //更新需要显示的分页条目 updatePageLinks():void{ this.pageLinks=[]; letboundaries=this.calculatePageLinkBoundaries; conststart=boundaries[0]; constend=boundaries[1]; for(leti=start;i<=end;i++){ this.pageLinks.push(i+1); } } //点击分页 changePage(p:number,event){ varpageCount=this.getPageCount(); if(p>0&&p<pageCount){ this.first=this.rows*p; conststate={ 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); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。