这个教程将介绍在AngularJS应用中的服务端分页处理。在任何涉及到列表或表格数据的应用中都可能会用到分页。

概念

当我们处理异步分页时,每次只从服务器上获取一页数据。也就是说当用户点击第二页,就只读取第二页的数据。

下载地址:

https://github.com/rahil471/Server-Side-Pagination-In-AngularJS

概述

在客户端我们将使用到 dir-paginate 组件。调用后台API需要传递两个参数 page number 和  items per page。举个例子,每页显示10条记录,在你查看第二页时,那么API需要返回的记录是从第11条记录开始的。除了返回数据项,API还需要返回总记录数。总记录数对于分页至关重要。

分页API解释

返回分页数据的API需要两个参数

http://yourdomain/apiname/{itemsPerPage}/{pagenumber}

有这两个参数 itemsPerPage 和 pagenumber 你就可以对向数据库发出恰当的请求了。例如,如果{itemsPerPage} 是 10 and {pagenumber} 是 3,API就会是下面的样子。

http://yourdomain/apiname/10/3

相应的MySQL查询语句就是这样的

SELECT * FROM 'table_name' LIMIT ({pagenumber}-)*{itemsPerPage},{itemsPerPage}

实际上如下:

SELECT * FROM 'table_name' LIMIT ,

上面的语句会返回 第21条到第30条的记录(MySql的索引号是从0开始的)。

实现

首先我们需要先获得创建HTML文件需要的组件,要实现分页需要先下载 dirPagination.js 或是这个 dirPagination.js

INDEX.HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Server Pagination in Angular js</title>
<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="css/bootstrap-theme.min.css">
<link rel="stylesheet" type="text/css" href="css/styles.css">
</head>
<body>
<script src="lib/angular/angular.js"></script>
<script src="lib/dirPagination.js"></script>
<script src="app/app.js"></script>
</body>
</html>

我们需要引用到  angular.js  和 dirPagination.js,app.js是我们用来编写JS代码的文件。还需要引用一些CSS来实现扁平化UI。

现在让我们创建下Angular app

APP/APP.JS

var app = angular.module('angularTable', ['angularUtils.directives.dirPagination']);
app.controller('listdata',function($http){
var vm = this;
vm.users = []; //declare an empty array
vm.pageno = ; // initialize page no to 1
vm.total_count = ;
vm.itemsPerPage = ; //this could be a dynamic value from a drop down
vm.getData = function(pageno){ // This would fetch the data on page change.
//In practice this should be in a factory.
vm.users = [];
$http.get("http://yourdomain/apiname/{itemsPerPage}/{pagenumber}").success(function(response){
//ajax request to fetch data into vm.data
vm.users = response.data; // data to be displayed on current page.
vm.total_count = response.total_count; // total data count.
});
};
vm.getData(vm.pageno); // Call the function to fetch initial data on page load.
});

上面的示例我们声明了angularJS的应用(app)和控制器(controller),并且添加了angularUtils.directives.dirPagination作为我们应用的依赖项。控制器中采用.vm代表 view-model 作为 this 的引用。首先我们对一些重要的参数进行了初始化。

1、vm.users – 用来存储页面上数据的集合。
   2、vm.pageno – 加载时设置当前页为1。
   3、vm.total_count – 存储总记录数。 结果又由API返回
   4、vm.itemsPerPage – 每页显示记录数 (可动态设置)
   5、vm.getData() – 每次用户点击新页时调用的方法. 初始加载第一页。

现在我们的控制器已经准备好了。下面我使用 dir-paginate 指令重复显示数据(替代了angularjs的ng-repeat指令),将total_count赋给total-items指令

dir-paginate将使用这个数值来生成分页链接。

<tr dir-paginate=”user in data.users|itemsPerPage:data.itemsPerPage” total-items=”data.total_count”>

下一步我们将使用dir-pagination-controls指令添加分页链接。

PAGINATION CONTROLS

   <dir-pagination-controls
max-size=""
direction-links="true"
boundary-links="true"
on-page-change="data.getData(newPageNumber)">
</dir-pagination-controls>

on-page-change 指令这里是关键,在每次页改变的时候都会调用一个函数,用这个指令来调用vm.getdata(pageno)方法。这个方法会使用新的页码向服务器请求下一页的数据。

不要忘记声明你自己的 ng-app 和 ng-controller。看下完成标记。

INDEX.HTML

<!doctype html>
<html lang="en" ng-app="angularTable">
<head>
<meta charset="utf-8">
<title>Server Side Pagination in Angular js</title>
<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="css/bootstrap-theme.min.css">
<link rel="stylesheet" type="text/css" href="css/styles.css">
</head>
<body>
<div role="main" class="container theme-showcase">
<div class="" style="margin-top:90px;">
<div class="col-lg-8">
<div class="page-header">
<h2 id="tables">Server Side pagination in Angular js</h2>
</div>
<div class="bs-component" ng-controller="listdata as data">
<table class="table table-striped table-hover">
<thead>
<tr>
<th>Id</th>
<th>First Name</th>
<th>Last Name</th>
<th>Full Name</th>
<th>Email</th>
</tr>
</thead>
<tbody>
<tr ng-show="data.users.length <= 0"><td colspan="" style="text-align:center;">Loading new data!!</td></tr>
<tr dir-paginate="user in data.users|itemsPerPage:data.itemsPerPage" total-items="data.total_count">
<td>{{user.index}}</td>
<td>{{user.name}}</td>
<td>{{user.surname}}</td>
<td>{{user.fullname}}</td>
<td>{{user.email}}</td>
</tr>
</tbody>
</table>
<dir-pagination-controls
max-size=""
direction-links="true"
boundary-links="true"
on-page-change="data.getData(newPageNumber)" >
</dir-pagination-controls>
</div>
</div>
</div>
</div>
<script src="lib/angular/angular.js"></script>
<script src="lib/dirPagination.js"></script>
<script src="app/app.js"></script>
</body>
</html>

ng-controller="listdata as data" 采用了ControllerAs语法。

如果想了解更多的dirPaginate ,你可以点击这里

结论

文章中我们已经看到如何在angularjs项目中简单地实现分页。分页通常用于大数据集。减少了加载时间,也使DOM轻便多了。

AngularJS中实现服务端分页的更多相关文章

  1. Angularjs的真分页,服务端分页,后台分页的解决方案

    背景:项目的框架使用的是Angularjs,在做数据展示的时候,使用的是ng-table.用过ng-table的人都知道,他是自带分页的,默认分页方式是假分页.也就是一口气把所有的数据从数据库里取出来 ...

  2. asp.net mvc bootstrap datatable 服务端分页

    datatable 服务端分页 因项目需求变动,需处理大量数据,更改成服务端分页,自己两天的学习笔记 先上图[ jqueryui风格] 前端代码: @{ Layout = null;} <!DO ...

  3. asp.net mvc bootstrap datatable 服务端分页 更新槽糕的代码【1】

    datatable 服务端分页 因项目需求变动,需处理大量数据,更改成服务端分页,自己两天的学习笔记 datatable 1.10.7 百度云下载  密码:0ea1 先上图[ jqueryui风格] ...

  4. BootStrap Table和Mybatis Plus实现服务端分页

    一.后台java代码(Mybatis Plus分页) (1)Mybatis Plus分页的配置,在mybatis的xml文件中增加如下配置(Mybatis Plus官方文档:http://baomid ...

  5. datatable.js 服务端分页+fixColumns列固定

    前言 记得还是15年的时候,工作需要,独自写后台管理系统..记得那时候,最让我头疼的不是后台逻辑,而是数据的列表展示. 列很多的时候,页面显示问题;分页样式问题;表格样式问题;数据加载...很多细节的 ...

  6. 基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询

    前言 基于SpringMVC+Bootstrap+DataTables实现数据表格服务端分页.模糊查询(非DataTables Search),页面异步刷新. 说明:sp:message标签是使用了S ...

  7. bootstrap-table+Django: 服务端分页

    分页方式: bootstrap-table提供两种分页方式,client和server,即客户端和服务端分页: 特点: client端分页:后台返回所有数据,前台翻页时不再请求后台. server端分 ...

  8. ThinkPHP整合datatables实现服务端分页

    最近做东西有一个需求,因为数据量很大,在这里我决定使用datatables的服务端分页,同时还需要传递查询条件到服务端.在网上搜索的大部分文章都感觉有些误差,于是自己封装了一下,主要配置/工具为: 服 ...

  9. jquery.dataTables的探索之路-服务端分页配置

    最近闲来无事想研究下数据表格,因为之前接触过layui和bootstrap的数据表格,本着能学多少学多少的学习态度,学习下dataTables的服务端分页配置.特与同学们一块分享下从中遇到的问题和解决 ...

随机推荐

  1. [工具]Microsoft To-Do,简约还是简陋?

    1. 简介 微软收购奇妙清单后,由奇妙清单的原班人马打造了一个全新的待办事项应用,就叫"To-Do"(简单粗暴,好像新浪微博直接就叫"微博"的感觉).这个应该刚 ...

  2. 学习Yii框架,有哪些比较好的网站

    1.http://www.yiiframework.com/ 2.http://www.kancloud.cn/curder/yii/247741 3.http://www.manks.top/yii ...

  3. ubuntu上lamp环境搭建

    首先,介绍个彻底删除linux已经安装的软件的方法. sudo apt-get purge mysql-server mysql-client mysql-common mysql-server-5. ...

  4. 几个常用的文本处理shell 命令:find、grep、sort、uniq、sed、awk

    find 文件查找 查找txt和pdf文件 find . \( -name "*.txt" -o -name "*.pdf" \) -print 查找所有字母开 ...

  5. 字典树trie

    字典树经常用于单词搜索,现在网络引擎中也应用了trie树: public class Trie{ private int SIZE = 26; private TrieNode root; Trie( ...

  6. Java--JDBC连接与Django--DATABASES设置

    JDBC 简介 JDBC(Java Data Base Connectivity,java 数据库连接)是一种用于执行 SQL 语句的 JavaAPI,可以为多种关系 数据库提供统一访问,它由一组用 ...

  7. length()方法,length属性和size()的方法的区别

    length()方法,length属性和size()的方法的区别: length()方法是针对字符串来说的,要求一个字符串的长度就要用到它的length()方法: length属性是针对Java中的数 ...

  8. CodeForces-731B

    如果当天有m支队伍,昨天选择了k个B方案,那么今天还需要买m-k个披萨,如果m-k是奇数,那就先买一种B,剩下的全部买A,如果是偶数,全部买A.如果中途出现只有0支队伍,然而昨天却买了一次B,那么直接 ...

  9. LOJ6000 - 「网络流 24 题」搭配飞行员

    原题链接 题意简述 求二分图的最大匹配. 题解 这里写的是匈牙利算法. 表示节点的当前匹配. 为真表示在这一轮匹配中,无法给节点一个新的匹配.所以如果为真就不用再dfs它了,直接continue就好. ...

  10. Linux的内核和权限

    1.内核包括的子系统是 : 进程管理系统 . 内存管理系统 . I/O管理系统 和文件管理系统  等四个子系统. 2.Linux系统中某个可执行文件属于root并且有setid,当一个普通用户 mik ...