关于Angular2+下数据表分页的实现

业务需求:

  • 正常分页功能要有。
  • 要做到缓加载(那个不全部加载表数据,随着查看,动态加载数据的那个名词叫啥来着?)

代码实现:

分页组件界面部分:

<div class="col-md-12 margin-bottom" *ngIf="pageParams.primaryTableTotalRows > 0">
  <li class="input-group">
    <span class="input-group-addon" style="border-color: #f2f4f8;background-color:#f2f4f8;">
      <button class="page-link previous" [disabled]="pageParams.currentPage<=full.pagingSkipRange" (click)="changePage(0, pageParams.currentPage, $event)" [style.color]="pageParams.currentPage<=full.pagingSkipRange ? '#b6b8bb': ''" [style.background-color]="pageParams.currentPage<=full.pagingSkipRange ? '#e0e5ee': ''"><<</button>
      <button class="page-link" [disabled]="pageParams.currentPage===page.pageNo" (click)="changePage(1, page.pageNo, $event)" *ngFor="let page of this.pageLabelList" [style.background-color]="pageParams.currentPage===page.pageNo ? '#e0e5ee': ''">{{page.pageNo}}</button>
      <button class="page-link next" [disabled]="pageParams.totalPagesAmount-this.pageOffset<full.pagingSkipRange" (click)="changePage(2, pageParams.currentPage, $event)" [style.color]="pageParams.totalPagesAmount-this.pageOffset<full.pagingSkipRange ? '#b6b8bb': ''" [style.background-color]="pageParams.totalPagesAmount-this.pageOffset<full.pagingSkipRange ? '#e0e5ee': ''">>></button>
    </span>
    <span class="input-group-addon" style="border-color: #f2f4f8;background-color:#f2f4f8;">总计 {{pageParams.primaryTableTotalRows}} 条,第 {{pageParams.currentPage}} / {{pageParams.totalPagesAmount}} 页</span>
  </li>
</div>
<div class="col-md-12 text-center text-sm text-dark-gray" *ngIf="!pageParams.primaryTableTotalRows">空</div>

分页组件逻辑部分:

export class PageComponent implements OnInit {
  @Input('pageParams') pageParams;
  @Output() changeCurrentPage: EventEmitter<Number> = new EventEmitter;
  public pageLabelList;
  public pageOffset: number;
  constructor(private full: FullLayoutComponent) {
    this.pageLabelList = [];
    this.pageOffset = 1;
  }
  ngOnInit() {
     this.initPageLabelList();
  }
  public initPageLabelList() {
    const pageLabelListSize = this.pageParams.totalPagesAmount <= this.full.pagingSkipRange ? this.pageParams.totalPagesAmount : this.full.pagingSkipRange;
    for (let index = 0; index < pageLabelListSize; index++) {
      this.pageLabelList.push({pageNo: index + 1});
    }
  }
  getPageLabelList(handleCode, pageNum) {
    this.pageLabelList = [];
    switch (handleCode) {
      case 0:
        this.pageOffset = (Math.floor((pageNum - 1) / this.full.pagingSkipRange) - 1) *     this.full.pagingSkipRange + 1;
        break;
      case 2:
        this.pageOffset = (Math.floor((pageNum - 1) / this.full.pagingSkipRange) + 1) * this.full.pagingSkipRange + 1;
        break;
      default:
    }
    let index = 0;
    while (index < this.full.pagingSkipRange && (this.pageOffset + index) <= this.pageParams.totalPagesAmount) {
      this.pageLabelList.push({pageNo: this.pageOffset + index});
      index++;
    }
    return this.pageLabelList;
  }
  changePage(handleCode, pageNum, event) {
    switch (handleCode) {
      case 0:
        this.pageParams.currentPage = this.pageOffset - this.full.pagingSkipRange;
        this.changeCurrentPage.emit(this.pageParams.currentPage);
        this.getPageLabelList(0, pageNum);
        event.target.blur();
        break;
      case 1:
        this.pageParams.currentPage = pageNum;
        this.changeCurrentPage.emit(this.pageParams.currentPage);
        break;
      case 2:
        this.pageParams.currentPage = pageNum % this.full.pagingSkipRange === 0 ? pageNum + 1 : Math.floor(pageNum / this.full.pagingSkipRange + 1) * this.full.pagingSkipRange + 1;
        this.changeCurrentPage.emit(this.pageParams.currentPage);
        this.getPageLabelList(2, pageNum);
        event.target.blur();
        break;
      default:
    }
  }
}

Notes:

在主界面中有两个变量定义了分页的一些信息:

public pagingSkipRange: number; // 分页跳跃范围
public rowsPerPage: number; // 每页获取多少条数据

因为根据需求,我们的分页并无需支持跳跃读页,也就是说,要读后面的表数据,只能从前面一步一步读过去。pagingSkipRange定义的是分页label显示的页的范围,比如定义的数字是5,那么起始分页栏就长成这样:[1,2,3,4,5],翻一页,下一个就是:[6,7,8,9,10],以此类推。rowsPerPage定义的是数据表每页显示多少行数据,比如5、10、20……值得一提的是,我们约定了一个规则,那就是pagingSkipRange * rowsPerPage的结果确定了我们预取的数据行的数量,比如pagingSkipRange=5rowsPerPage=10,那第一次以及每一次取数据的行数就是50条。

在每一个具体业务中,界面分页部分的代码如下:

<app-page *ngIf="this.isPagingAvailable"
  [pageParams]="{primaryTableTotalRows:this.full.params.userModule.primaryTableTotalRows,
   currentPage:this.currentPage, totalPagesAmount:this.totalPagesAmount}"
  (changeCurrentPage)="getPageData($event)">
</app-page>

逻辑部分代码如下:

getDataTable(page: number, searchInfo: string) {
  let respData = '';
  const requestUrl = '/user-manage/get-user';
  const params = {
    rowOffset: (page - 1) * this.full.rowsPerPage,
    rowRange: this.full.rowsPerPage * this.full.pagingSkipRange,
    searchInfo: searchInfo
  };
  this.submitService.getSubmitWithRelativeUrl(requestUrl, JSON.stringify(params))
    .then(
      responseData => respData = responseData,
      error => this.errorMessage = <any>error)
    .then(() => {
      const responseData = JSON.parse(respData);
      if (responseData.responseCode === '100') {
        alert('您尚未登录或会话过期,请重新登录!');
        this.router.navigate(['']).then();
      } else {
        this.full.params['userModule'].primaryTableData = this.full.params['userModule'].primaryTableData.concat(responseData.userData);
        this.full.params['userModule'].primaryTableTotalRows = responseData.totalRows;
        this.totalPagesAmount = Math.ceil(this.full.params['userModule'].primaryTableTotalRows / this.full.rowsPerPage);
        this.pagesExisted.add(page);
        this.isPagingAvailable = true;
        this.currentPage = page;
      }
    });
}
// Invoked each time when paging label was clicked.
getPageData(pageNo) {
  if (pageNo % this.full.pagingSkipRange === 1) {
    if (!this.pagesExisted.has(pageNo)) {
      this.getDataTable(pageNo, this.searchInfo);
      return;
    }
  }
  this.currentPage = pageNo;
}
findUser(searchInfo: string) {
  if (!searchInfo) {
    return;
  }
  if (this.searchInfo === searchInfo) {
    this.currentPage = 1;
  } else {
    this.pagesExisted.clear();
    this.isPagingAvailable = false;
    this.full.params['userModule'].primaryTableData = [];
    this.full.params['userModule'].primaryTableTotalRows = 0;
    this.getDataTable(1, searchInfo);
  }
}
refresh(element) {
  element.value = '';
  this.pagesExisted.clear();
  this.isPagingAvailable = false;
  this.full.params['userModule'].primaryTableData = [];
  this.full.params['userModule'].primaryTableTotalRows = 0;
  this.getDataTable(1, '');
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容