// custom-pagination.tsimport { Component,OnInit,Input,Output,EventEmitter,OnChanges,forwardRef } from '@angular/core'
'@angular/forms'@Component({
selector: 'custom-pagination'<span style="color: #000000">,templateUrl: './pagination.component.html'<span style="color: #000000">,styleUrls: ['./pagination.component.css'<span style="color: #000000">],providers: [{
provide: NG_VALUE_ACCESSOR,useExisting: forwardRef(() =><span style="color: #000000"> PaginationComponent),multi: <span style="color: #0000ff">true<span style="color: #000000">
}]
})
export class PaginationComponent implements OnInit,OnChanges {
constructor() { }
@Input() totalPage: any;
@Input() maxSize: any = 5<span style="color: #000000">;
@Input() moreBtn: Boolean = <span style="color: #0000ff">true<span style="color: #000000">;
@Input() turnBtn: Boolean = <span style="color: #0000ff">true<span style="color: #000000">;
@Input() fastTurnBtn: Boolean = <span style="color: #0000ff">true<span style="color: #000000">;
@Output() currentPageChange: EventEmitter = <span style="color: #0000ff">new<span style="color: #000000"> EventEmitter;
@Output() changePage: EventEmitter = <span style="color: #0000ff">new<span style="color: #000000"> EventEmitter;
private currentPage = 1<span style="color: #000000">;
showPageList: Array =<span style="color: #000000"> [];
showEndPage = 0<span style="color: #000000">;
showBeginPage = 0<span style="color: #000000">;
showLeftMoreStatus = <span style="color: #0000ff">false<span style="color: #000000">;
showRightMoreStatus = <span style="color: #0000ff">false<span style="color: #000000">;
ngOnInit() {
}
ngOnChanges () { // 异步获取的数据,在ngOnChange里监听数据变化后再处理分页
<span style="color: #0000ff">this<span style="color: #000000">.initPages();
}
currentChange() {
<span style="color: #0000ff">this.currentPageChange.emit(<span style="color: #0000ff">this<span style="color: #000000">.currentPage);
}
goToPage (page) {
<span style="color: #0000ff">if (page && <span style="color: #0000ff">this.currentPage !==<span style="color: #000000"> page) {
<span style="color: #0000ff">this.currentPage =<span style="color: #000000"> page;
<span style="color: #0000ff">this<span style="color: #000000">.changePageHandle();
}
}
prevNextPage (page) {
console.log(<span style="color: #0000ff">this<span style="color: #000000">.currentPage)
<span style="color: #0000ff">if (<span style="color: #0000ff">this.totalPage < 2<span style="color: #000000">) {
<span style="color: #0000ff">return<span style="color: #000000">;
}
let pageNum;
<span style="color: #0000ff">if (page === '上一页'<span style="color: #000000">) {
pageNum = <span style="color: #0000ff">this.currentPage === 1 ? <span style="color: #0000ff">this.currentPage : <span style="color: #0000ff">this.currentPage - 1<span style="color: #000000">;
} <span style="color: #0000ff">else<span style="color: #000000"> {
pageNum = <span style="color: #0000ff">this.currentPage === <span style="color: #0000ff">this.totalPage ? <span style="color: #0000ff">this.currentPage : <span style="color: #0000ff">this.currentPage + 1<span style="color: #000000">;
}
<span style="color: #0000ff">if (pageNum !== <span style="color: #0000ff">this<span style="color: #000000">.currentPage) {
<span style="color: #0000ff">this.currentPage =<span style="color: #000000"> pageNum;
<span style="color: #0000ff">this<span style="color: #000000">.changePageHandle();
}
}
leftMoreClick () { // 左更多按钮点击后处理当前显示的分页
const startPage = <span style="color: #0000ff">this.showBeginPage - <span style="color: #0000ff">this<span style="color: #000000">.maxSize;
const endPage = startPage + <span style="color: #0000ff">this<span style="color: #000000">.maxSize;
<span style="color: #0000ff">this.currentPage -= Math.ceil((endPage - startPage) / 2<span style="color: #000000">);
<span style="color: #0000ff">this<span style="color: #000000">.changePageHandle()
}
rightMoreClick () { // 右更多分页按钮点击后处理当前显示的分页
let startPage;
<span style="color: #0000ff">if ((<span style="color: #0000ff">this.showEndPage + <span style="color: #0000ff">this.maxSize) < <span style="color: #0000ff">this<span style="color: #000000">.totalPage) {
startPage = <span style="color: #0000ff">this.showEndPage + <span style="color: #0000ff">this<span style="color: #000000">.maxSize;
} <span style="color: #0000ff">else<span style="color: #000000"> {
startPage = <span style="color: #0000ff">this.totalPage - <span style="color: #0000ff">this<span style="color: #000000">.maxSize;
}
const endPage = startPage + <span style="color: #0000ff">this<span style="color: #000000">.maxSize;
<span style="color: #0000ff">this.currentPage += Math.ceil((endPage - startPage) / 2<span style="color: #000000">);
<span style="color: #0000ff">this<span style="color: #000000">.changePageHandle()
}
formatPages () { // 操作页码后处理需要显示的新页码数据
<span style="color: #0000ff">if (<span style="color: #0000ff">this.totalPage > <span style="color: #0000ff">this<span style="color: #000000">.maxSize) {
const formatRightPage = <span style="color: #0000ff">this.showEndPage - Math.ceil(<span style="color: #0000ff">this.maxSize / 2<span style="color: #000000">); // 需要向后处理显示分页数据的分界点
const formatLeftPage = <span style="color: #0000ff">this.showBeginPage + Math.floor(<span style="color: #0000ff">this.maxSize / 2<span style="color: #000000">); // 需要向前处理显示分页数据的分界点
let startPage; // 需要显示的开始页码
<span style="color: #0000ff">if (<span style="color: #0000ff">this.currentPage > formatRightPage || <span style="color: #0000ff">this.currentPage <<span style="color: #000000"> formatLeftPage) {
startPage = <span style="color: #0000ff">this.currentPage - Math.floor(<span style="color: #0000ff">this.maxSize / 2) > 0 ? <span style="color: #0000ff">this.currentPage - Math.floor(<span style="color: #0000ff">this.maxSize / 2) : 1<span style="color: #000000">;
<span style="color: #0000ff">this.showBeginPage =<span style="color: #000000"> startPage;
<span style="color: #0000ff">this.showEndPage = (startPage + <span style="color: #0000ff">this.maxSize) < <span style="color: #0000ff">this.totalPage ? (startPage + <span style="color: #0000ff">this.maxSize) : <span style="color: #0000ff">this<span style="color: #000000">.totalPage;
<span style="color: #0000ff">if (<span style="color: #0000ff">this.showEndPage - <span style="color: #0000ff">this.showBeginPage <= <span style="color: #0000ff">this<span style="color: #000000">.maxSize) { // 如果处理后显示的分页数量少于maxSize,处理需要显示的开始页码满足maxSize
startPage = <span style="color: #0000ff">this.showEndPage - <span style="color: #0000ff">this<span style="color: #000000">.maxSize;
<span style="color: #0000ff">this.showBeginPage =<span style="color: #000000"> startPage;
}
<span style="color: #0000ff">this.handlePagesData(startPage,<span style="color: #0000ff">this<span style="color: #000000">.showEndPage);
}
}
console.log(<span style="color: #0000ff">this<span style="color: #000000">.showPageList)
}
initPages () { // 根据传入的参数初始化页码
<span style="color: #0000ff">if (<span style="color: #0000ff">this.totalPage > <span style="color: #0000ff">this<span style="color: #000000">.maxSize) {
<span style="color: #0000ff">this.maxSize--<span style="color: #000000">;
const startPage = <span style="color: #0000ff">this<span style="color: #000000">.currentPage;
<span style="color: #0000ff">this.showBeginPage =<span style="color: #000000"> startPage;
<span style="color: #0000ff">this.showEndPage = startPage + <span style="color: #0000ff">this<span style="color: #000000">.maxSize;
<span style="color: #0000ff">this.handlePagesData(startPage,<span style="color: #0000ff">this<span style="color: #000000">.showEndPage);
} <span style="color: #0000ff">else<span style="color: #000000"> {
<span style="color: #0000ff">this.showBeginPage = <span style="color: #0000ff">this<span style="color: #000000">.currentPage;
<span style="color: #0000ff">this.showEndPage = <span style="color: #0000ff">this<span style="color: #000000">.totalPage;
<span style="color: #0000ff">for (let i = 1; i <= <span style="color: #0000ff">this.totalPage; i++<span style="color: #000000">) {
<span style="color: #0000ff">this<span style="color: #000000">.showPageList.push(i)
}
}
<span style="color: #0000ff">this<span style="color: #000000">.showPagesMore();
}
handlePagesData (begin,end) { // 循环生成要显示的页码数据
<span style="color: #0000ff">this.showPageList =<span style="color: #000000"> [];
<span style="color: #0000ff">for (let i = begin; i <= end; i++<span style="color: #000000">) {
<span style="color: #0000ff">this<span style="color: #000000">.showPageList.push(i)
}
}
showPagesMore () { // 判断是否满足显示向左向右更多分页按钮的条件
<span style="color: #0000ff">if (<span style="color: #0000ff">this.currentPage > <span style="color: #0000ff">this.maxSize * 2<span style="color: #000000">) {
<span style="color: #0000ff">this.showLeftMoreStatus = <span style="color: #0000ff">true<span style="color: #000000">;
} <span style="color: #0000ff">else<span style="color: #000000"> {
<span style="color: #0000ff">this.showLeftMoreStatus = <span style="color: #0000ff">false<span style="color: #000000">;
}
<span style="color: #0000ff">if (<span style="color: #0000ff">this.showEndPage < <span style="color: #0000ff">this<span style="color: #000000">.totalPage) {
<span style="color: #0000ff">this.showRightMoreStatus = <span style="color: #0000ff">true<span style="color: #000000">;
} <span style="color: #0000ff">else<span style="color: #000000"> {
<span style="color: #0000ff">this.showRightMoreStatus = <span style="color: #0000ff">false<span style="color: #000000">;
}
}
changePageHandle () { // 翻页后触发方法
<span style="color: #0000ff">this<span style="color: #000000">.formatPages();
<span style="color: #0000ff">this<span style="color: #000000">.showPagesMore();
<span style="color: #0000ff">this.onModelChange(<span style="color: #0000ff">this<span style="color: #000000">.currentPage); // 触发ngModel绑定的数据更新
<span style="color: #0000ff">this.changePage.emit(<span style="color: #0000ff">this<span style="color: #000000">.currentPage); // 向外触发自定义方法,并传值
}
onModelChange: Function = () =><span style="color: #000000"> { };
<span style="color: #008000">//<span style="color: #008000"> 页面的值改变,调用改方法,并调用onModelChange传入改变后的值,实现值得回传
writeValue(val): <span style="color: #0000ff">void<span style="color: #000000"> {
<span style="color: #008000">//<span style="color: #008000"> 页面初始化时时,调用该方法,传入初始值
<span style="color: #0000ff">if<span style="color: #000000"> (val) {
<span style="color: #0000ff">this.currentPage =<span style="color: #000000"> val;
}
}
registerOnChange(fn: any): <span style="color: #0000ff">void<span style="color: #000000"> {
<span style="color: #008000">//<span style="color: #008000"> 页面值改变时,调用该方法,传入新值实现回传
<span style="color: #0000ff">this.onModelChange =<span style="color: #000000"> fn;
}
registerOnTouched(fn: any): <span style="color: #0000ff">void<span style="color: #000000"> {
}
}