Angular2 PrimeNG分页模块学习

发布时间 - 2026-01-10 22:31:37    点击率:

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);
}

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


# Angular2  # PrimeNG分页  # Paginator分页组件  # Angular2分页  # Angular2自定义分页组件  # 分页  # 每页  # 第一页  # 下一页  # 上一页  # 几个  # 鼠标  # 这段  # 可在  # 自定义  # 大家多多  # 后向  # 组中  # 移出  # 当前页  # disabled  # ngClass  # changePageToFirst  # pages  # null 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  昵图网官方站入口 昵图网素材图库官网入口  Laravel如何实现事件和监听器?(Event & Listener实战)  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  JavaScript如何实现类型判断_typeof和instanceof有什么区别  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  潮流网站制作头像软件下载,适合母子的网名有哪些?  Laravel如何使用Vite进行前端资源打包?(配置示例)  如何自定义建站之星模板颜色并下载新样式?  java获取注册ip实例  高性价比服务器租赁——企业级配置与24小时运维服务  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  zabbix利用python脚本发送报警邮件的方法  如何用AWS免费套餐快速搭建高效网站?  Laravel如何使用Telescope进行调试?(安装和使用教程)  开心动漫网站制作软件下载,十分开心动画为何停播?  JavaScript中的标签模板是什么_它如何扩展字符串功能  javascript基本数据类型及类型检测常用方法小结  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  在线教育网站制作平台,山西立德教育官网?  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  装修招标网站设计制作流程,装修招标流程?  js代码实现下拉菜单【推荐】  Laravel如何使用查询构建器?(Query Builder高级用法)  利用vue写todolist单页应用  如何在七牛云存储上搭建网站并设置自定义域名?  如何登录建站主机?访问步骤全解析  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  ,怎么在广州志愿者网站注册?  南京网站制作费用,南京远驱官方网站?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  PHP正则匹配日期和时间(时间戳转换)的实例代码  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  🚀拖拽式CMS建站能否实现高效与个性化并存?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  Python高阶函数应用_函数作为参数说明【指导】  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  黑客如何利用漏洞与弱口令入侵网站服务器?  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  如何用VPS主机快速搭建个人网站?  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理