Angular2自定义分页组件


Posted in Javascript onApril 19, 2017

在项目中,前端传给后台的参数有:

pageSize:每页的条数

pageNo:当前页码

比如当前是第1页,每页20条,则后台返回第1页的20条记录(sql应该是用limit去获取分页数据)

同时,后台接口还会返回列表的总条数totalNum,前端根据totaNum/pageSize计算总共有多少页

如图:

Angular2自定义分页组件

注意事项:

需要先配置好路由(Angular2路由与导航)

使用步骤:

(1)在项目中引入分页组件

// app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';

import { AppComponent } from './app.component';
import { RouterModule }  from '@angular/router';
import { Demo }  from './demo/demo';
import { Page }  from './page/page';
@NgModule({
 declarations: [
  AppComponent,
  Demo,
  Page
 ],
 imports: [
  BrowserModule,
  FormsModule,
  RouterModule.forRoot([
   {
    path: 'demo',
    component: Demo
   }
  ]),
  HttpModule
 ],
 providers: [],
 bootstrap: [AppComponent]
})
export class AppModule {
}

(2)在页面中使用分页组件:

// demo.html
<!--分页组件参数:pageSize,totalNum,curPage,totalPage-->
<page-template [pageParams]="{pageSize:20,totalNum:100,curPage:1,totalPage:5}" (changeCurPage)="getPageData($event)"></page-template>

// demo.ts
import { Component } from '@angular/core';
import { Location } from '@angular/common';
import { Router } from '@angular/router';

@Component({
 selector: 'demo',
 templateUrl: './demo.html'
})
export class Demo {
 public params; // 保存页面url参数
 public totalNum = 0; // 总数据条数
 public pageSize = 20;// 每页数据条数
 public totalPage = 0;// 总页数
 public curPage = 1;// 当前页码
 constructor(location:Location) {
  let vm = this;
  if (vm.params) {
   vm.params = vm.params.replace('?', '').split('&');
   let theRequest = [];
   for (let i = 0; i < vm.params.length; i++) {
    theRequest[vm.params[i].split("=")[0]] = vm.params[i].split("=")[0] == 'pageNo' ? parseInt(vm.params[i].split("=")[1]) : vm.params[i].split("=")[1];
   }
   vm.params = theRequest;
   if (vm.params['pageNo']) {
    vm.curPage = vm.params['pageNo'];
    //console.log('当前页面', vm.curPage);
   }
  } else {
   vm.params = {};
  }
 }
 getPageData(pageNo) {
  let vm = this;
  vm.curPage = pageNo;
  console.log('触发', pageNo);
 }
}

分页组件源码:

page.html

<!--分页组件-->
<div class="col-md-12 text-right margin-bottom" *ngIf="pageParams.totalPage>1 && pageParams.totalNum>0">
 <a class="pull-left text-sm">总计 {{pageParams.totalNum}} 条,第 {{pageParams.curPage}} / {{pageParams.totalPage}} 页</a>
 <button class="btn btn-default previous" [routerLink]="['./']" [disabled]="pageParams.curPage<=5"
     (click)="changePage(pageParams.curPage-5)" [queryParams]="{pageNo:pageParams.curPage-5}"><<</button>
 <button class="btn btn-default next" [routerLink]="['./']" (click)="changePage(pageParams.curPage-1)"
     [queryParams]="{pageNo:pageParams.curPage-1}" [disabled]="pageParams.curPage==1">上一页</button>
 <button class="btn btn-default" [routerLink]="['./']" [disabled]="pageParams.curPage==page.pageNo"
     (click)="changePage(page.pageNo)" [queryParams]="page" *ngFor="let page of getPageList(pageParams)">
  {{page.pageNo}}
 </button>
 <button class="btn btn-default next" [routerLink]="['./']" (click)="changePage(pageParams.curPage-(-1))"
     [queryParams]="{pageNo:pageParams.curPage-(-1)}" [disabled]="pageParams.curPage==pageParams.totalPage">下一页</button>
 <button class="btn btn-default previous" [routerLink]="['./']" [disabled]="pageParams.totalPage-pageParams.curPage<=5"
     (click)="changePage(pageParams.curPage-(-5))" [queryParams]="{pageNo:pageParams.curPage-(-5)}">>></button>
</div>
<div class="col-md-12 text-center text-sm text-dark-gray" *ngIf="!pageParams.totalNum">
 空空如也
</div>

page.ts

import { Component,Input, Output,EventEmitter } from '@angular/core';
@Component({
 selector: 'page',
 templateUrl: './page.html'
})

export class Page {
 @Input('pageParams') pageParams;// 父组件向子组件传值
 @Output() changeCurPage:EventEmitter<Number> = new EventEmitter;// 子组件向父组件广播事件,触发改变当前页面的事件

 public pageList = [1, 2, 3, 4, 5];
 public totalPage = 5;

 constructor() {
  let vm = this;
  //console.log('从父组件获取的参数', vm['pageParams']);

 }

 getPageList(pageParams) {
  /*分页设置*/
  let pageList=[];
  if (pageParams.totalPage <= 5) {//如果总的页码数小于5(前五页),那么直接放进数组里显示
   for (let i = 0; i < pageParams.totalPage; i++) {
    pageList.push({
     pageNo: i + 1
    });
   }
  } else if (pageParams.totalPage - pageParams.curPage < 5 && pageParams.curPage > 4) {//如果总的页码数减去当前页码数小于5(到达最后5页),那么直接计算出来显示
   pageList = [
    {
     pageNo: pageParams.curPage - 4
    }, {
     pageNo: pageParams.curPage - 3
    }, {
     pageNo: pageParams.curPage - 2
    }, {
     pageNo: pageParams.curPage - 1
    }, {
     pageNo: pageParams.curPage
    }
   ];
  } else {//在中间的页码数
   let cur = Math.floor((pageParams.curPage - 1) / 5) * 5 + 1;
   pageList = [
    {
     pageNo: cur
    }, {
     pageNo: cur + 1
    }, {
     pageNo: cur + 2
    }, {
     pageNo: cur + 3
    }, {
     pageNo: cur + 4
    },
   ];
  }
  return pageList;
 }
 changePage(pageNo) {
  let vm = this;
  //console.log('修改页码', pageNo);
  vm.pageParams.curPage = pageNo;
  vm.changeCurPage.emit(vm.pageParams.curPage);
 }
}

ng2还在入门中,组件有待完善,请多多指教

项目demo:https://github.com/youzouzou/ng2-paginator

源码下载:http://xiazai.3water.com/201704/yuanma/ng2-paginator-master_3water.rar

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
Apr 27 Javascript
新浪微博字数统计 textarea字数统计实现代码
Aug 28 Javascript
JS 获取浏览器和屏幕宽高等信息代码
Mar 31 Javascript
JS &amp; JQuery 动态添加 select option
Jun 08 Javascript
详解ES6中的let命令
Apr 05 Javascript
javascript中call,apply,bind函数用法示例
Dec 19 Javascript
ng2学习笔记之bootstrap中的component使用教程
Mar 09 Javascript
详解JavaScript中的六种错误类型
Sep 21 Javascript
Vue实现数字输入框中分割手机号码的示例
Oct 10 Javascript
小程序tab页无法传递参数的方法
Aug 03 Javascript
使用javascript做时间倒数读秒功能的实例
Jan 23 Javascript
vue v-model的用法解析
Oct 19 Javascript
详解vue表单验证组件 v-verify-plugin
Apr 19 #Javascript
纯JS实现图片验证码功能并兼容IE6-8(推荐)
Apr 19 #Javascript
Vue.js仿Metronic高级表格(二)数据渲染
Apr 19 #Javascript
JavaScript实现前端分页控件
Apr 19 #Javascript
vue动态生成dom并且自动绑定事件
Apr 19 #Javascript
Vue响应式原理详解
Apr 18 #Javascript
详解vue-router基本使用
Apr 18 #Javascript
You might like
抓取YAHOO股票报价的类
2009/05/15 PHP
PHP判断远程url是否有效的几种方法小结
2011/10/08 PHP
PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
2013/06/18 PHP
php二维数组按某个键值排序的实例讲解
2019/02/15 PHP
PHP面向对象程序设计之对象克隆clone和魔术方法__clone()用法分析
2019/06/12 PHP
DOM相关内容速查手册
2007/02/07 Javascript
学习ExtJS border布局
2009/10/08 Javascript
javascript写的日历类(基于pj)
2010/12/28 Javascript
{}与function(){}选用空对象{}来存放keyValue
2012/05/23 Javascript
jquery限制输入字数,并提示剩余字数实现代码
2012/12/24 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
2015/07/01 Javascript
js实现三张图(文)片一起切换的banner焦点图
2015/08/25 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
2015/10/12 Javascript
js实现图片轮播效果
2015/12/19 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
js绘制购物车抛物线动画
2020/11/18 Javascript
纯JS实现弹性导航条效果
2017/03/06 Javascript
vue的token刷新处理的方法
2018/07/17 Javascript
Vue动态路由缓存不相互影响的解决办法
2019/02/19 Javascript
vue router总结 $router和$route及router与 router与route区别
2019/07/05 Javascript
[01:21]DOTA2新纪元-7.0新版本即将开启!
2016/12/11 DOTA
[48:12]Secret vs Optic Supermajor 胜者组 BO3 第三场 6.4
2018/06/05 DOTA
python登录并爬取淘宝信息代码示例
2017/12/09 Python
Python语言生成水仙花数代码示例
2017/12/18 Python
使用DataFrame删除行和列的实例讲解
2018/04/08 Python
python bmp转换为jpg 并删除原图的方法
2018/10/25 Python
python设置随机种子实例讲解
2019/09/12 Python
Python aiohttp百万并发极限测试实例分析
2019/10/26 Python
解决import tensorflow导致jupyter内核死亡的问题
2021/02/06 Python
Emporio Armani腕表天猫官方旗舰店:乔治·阿玛尼为年轻人设计的副线品牌
2017/07/02 全球购物
以思科路由器为例你写下单臂路由的配置命令
2013/08/03 面试题
办公设备采购方案
2014/03/16 职场文书
新闻专业毕业生求职信
2014/08/08 职场文书
向雷锋同志学习倡议书
2015/04/27 职场文书
2016年秋季运动会广播稿
2015/12/21 职场文书
小学运动会开幕词
2016/03/04 职场文书