当前位置:Gxlcms > JavaScript > Angular2 PrimeNG分页模块学习

Angular2 PrimeNG分页模块学习

时间:2021-07-01 10:21:17 帮助过:15人阅读

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从分页按钮数组中循环出来的,所以我们需要去确定这个数组

下面处理数组,和各个按钮的事件

  1. //每页显示条目,默认0
  2. @Input() rows: number = 0;
  3. //显示分页按钮数量,默认5
  4. @Input() pageLinkSize: number = 5;
  5. //点击按钮后向父组件发送事件
  6. @Output() onPageChange: EventEmitter<any> = new EventEmitter();
  7. //调整每页显示条目数量的下拉菜单
  8. @Input() rowsPerPageOptions: number[];
  9. //定义分页按钮
  10. pageLinks: number[];
  11. _totalRecords: number = 0;
  12. _first: number = 0;
  13. //数据总数
  14. @Input() get totalRecords(): number {
  15. return this._totalRecords;
  16. }
  17. set totalRecords(val: number) {
  18. this._totalRecords = val;
  19. this.updatePageLinks();
  20. }
  21. //高亮按钮位置
  22. @Input() get first(): number {
  23. return this._first;
  24. }
  25. set first(val: number) {
  26. this._first = val;
  27. this.updatePageLinks();
  28. }
  1. //获取一共多少页
  2. getPageCount() {
  3. return Math.ceil(this.totalRecords / this.rows) || 1;
  4. }
  5. //获取当前页,0为第一页
  6. getPage(): number {
  7. return Math.floor(this.first / this.rows);
  8. }
  9. //是否为第一页
  10. isFirstPage(): boolean {
  11. return this.getPage() === 0;
  12. }
  13. //是否为最后一页
  14. isLastPage(): boolean {
  15. return this.getPage() === this.getPageCount() - 1;
  16. }
  1. //确定当先需要显示的起始分页和结束分页
  2. calculatePageLinkBoundaries() {
  3. let numberOfPages = this.getPageCount();
  4. let visiblePages = Math.min(this.pageLinkSize, numberOfPages);
  5. let start = Math.max(0, Math.ceil(this.getPage() - (visiblePages / 2)));
  6. let end = Math.min(numberOfPages - 1, start + visiblePages - 1);
  7. const delta = this.pageLinkSize - (end - start + 1);
  8. start = Math.max(0, start - delta);
  9. return [start, end];
  10. }
  11. //更新需要显示的分页条目
  12. updatePageLinks(): void {
  13. this.pageLinks = [];
  14. let boundaries = this.calculatePageLinkBoundaries;
  15. const start = boundaries[0];
  16. const end = boundaries[1];
  17. for (let i = start; i <= end; i++) {
  18. this.pageLinks.push(i + 1);
  19. }
  20. }
  21. //点击分页
  22. changePage(p: number, event) {
  23. var pageCount = this.getPageCount();
  24. if (p > 0 && p < pageCount) {
  25. this.first = this.rows * p;
  26. const state = {
  27. page: p,
  28. first: this.first,
  29. rows: this.rows,
  30. pageCount: pageCount
  31. };
  32. this.updatePageLinks();
  33. this.onPageChange.emit(state);
  34. }
  35. if (event) {
  36. event.preventDefault();
  37. }
  38. }
  1. //第一页
  2. changePageToFirst(event){
  3. this.changePage(0,event);
  4. }
  5. //上一页
  6. changePageToPrev(event){
  7. this.changePage(this.getPage() - 1,event);
  8. }
  9. //下一页
  10. changePageToNext(event){
  11. this.changePage(this.getPage() + 1,event);
  12. }
  13. //最后一页
  14. changePageToLast(event){
  15. this.changePage(this.getPageCount() - 1,event);
  16. }
  17. //通过下拉菜单更改每页显示数量
  18. onRppChange(event){
  19. this.rows = this.rowsPerPageOptions[event.target.selectedIndex];
  20. this.changePageToFirst(event);
  21. }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

人气教程排行