[Angularjs]单页应用之分页

写在前面

在项目中,用到单页应用的分页,当时想到使用滚动加载的方案,可是几次尝试都没配置成功,闲着无聊就弄了一个demo。

系列文章

[Angularjs]ng-select和ng-options

[Angularjs]ng-show和ng-hide

[Angularjs]视图和路由(一)

[Angularjs]视图和路由(二)

[Angularjs]视图和路由(三)

[Angularjs]视图和路由(四)

[Angularjs]ng-class,ng-class-even,ng-class-odd

一个例子

这里需要用到infinite-scroll,可以去这里下载:http://sroze.github.io/ngInfiniteScroll/index.html

Html

<!DOCTYPE html>
<html ng-app="myapp">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>滚动分页</title>
    <meta charset="utf-8" />
    <script src="JS/jquery.js"></script>
    <script src="JS/angular.js"></script>
    <script src="JS/ng-infinite-scroll.js"></script>

    <script>
        var app = angular.module(‘myapp‘, [‘infinite-scroll‘]);
        app.controller(‘PersonController‘, function ($scope, $http) {

            $scope.data = {
                busy: false,
                users: [],
                page: 1
            };
            //加载更多
            $scope.loadMore = function () {
                //是否正在加载
                if ($scope.data.busy) {
                    return;
                }
                $scope.data.busy = true;
                $http.get("/Service/UserInfo.ashx?page=" + $scope.data.page).success(function (data) {
                    console.log(data);
                    for (var i = 0; i < data.length; i++) {
                        $scope.data.users.push(data[i]);
                    }
                });
                $scope.data.busy = false;
                $scope.data.page++;
            }
        });
        //过滤器
        app.filter(‘toGenderString‘, function () {
            return function (input) {
                if (input) {
                    return ‘男‘;
                } else {
                    return ‘女‘;
                }
            };
        });
        //将json格式的时间转换成一般时间
        app.filter(‘formatDate‘, function () {
            return function (jsondate) {
                jsondate = jsondate.replace("/Date(", "").replace(")/", "");
                if (jsondate.indexOf("+") > 0) {
                    jsondate = jsondate.substring(0, jsondate.indexOf("+"));
                } else if (jsondate.indexOf("-") > 0) {
                    jsondate = jsondate.substring(0, jsondate.indexOf("-"));
                }
                var date = new Date(parseInt(jsondate, 10));
                var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
                var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
                return date.getFullYear() + "-" + month + "-" + currentDate;

            };
        });
    </script>
    <style type="text/css">
        * {
            margin: 0;
            padding: 0;
        }

        div {
            width: 98%;
            border: 1px solid #0094ff;
            text-align: center;
        }

        table {
            margin: 3px auto;
            border: 0px solid #0094ff;
        }

        td {
            height: 30px;
        }
    </style>
</head>
<body>
    <div ng-controller="PersonController">

        <div infinite-scroll="loadMore()" infinite-scroll-disabled=‘data.busy‘ infinite-scroll-distance=‘20‘>
            <table cellpadding="0" cellspacing="0" border="1">
                <tr><th>序号</th><th>姓名</th><th>创建时间</th><th>性别</th></tr>
                <tr ng-repeat="user in data.users">
                    <td>{{user.ID}}</td>
                    <td>{{user.Name}} </td>
                    <td>{{user.CreateDate|formatDate}}</td>
                    <td>{{user.Gender|toGenderString}}</td>
                </tr>
            </table>
        </div>
    </div>
</body>
</html>

一般处理程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Caching;
using System.Web.Script.Serialization;

namespace Wolfy.AngularJs.Service
{
    /// <summary>
    /// UserInfo 的摘要说明
    /// </summary>
    public class UserInfo : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            int page = Convert.ToInt32(context.Request["page"]);
            int pageSize = 20;
            context.Response.ContentType = "application/json";
            List<Person> lstPersons = null;
            var obj = context.Cache.Get("persons");
            if (obj == null)
            {
                lstPersons = new List<Person>();
                for (int i = 0; i < 1000; i++)
                {
                    lstPersons.Add(new Person()
                    {
                        ID = i + 1,
                        Gender = i % 2 == 0 ? true : false,
                        Name = "wolfy" + (i + 1).ToString()
                    });
                }
                context.Cache.Insert(
                    "persons",
                     lstPersons,
                     null,
                     DateTime.Now.AddSeconds(20),
                     Cache.NoSlidingExpiration,
                     CacheItemPriority.Low,
                     CacheItemRemovedCallback);
            }
            else
            {
                lstPersons = obj as List<Person>;
            }

            JavaScriptSerializer jss = new JavaScriptSerializer();
            //分页
            var pageList = lstPersons.Skip(pageSize * (page - 1)).Take(pageSize);
            string json = jss.Serialize(pageList);
            context.Response.Write(json);
        }
        //这个为缓存移除时的回调函数,一定要保持与 Cache.Insert()方法中的最后一个参数名字一致,
        //这里使用了委托,你可以在 Cache.Insert()这个函数中转定义看到的,所以这里的格式就只能按我写的这种方法签名写。
        public static void CacheItemRemovedCallback(string key, object value, CacheItemRemovedReason reason)

        {

        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
    public class Person
    {
        /// <summary>
        /// 编号
        /// </summary>
        public int ID { set; get; }
        /// <summary>
        /// 姓名
        /// </summary>
        public string Name { set; get; }
        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime CreateDate { set; get; } = DateTime.Now;
        /// <summary>
        /// 性别,true 男 false 女
        /// </summary>
        public bool Gender { set; get; } = true;

    }
}

测试结果

总结

这是在项目中用到一种分页特效,在移动端还是用的比较多的,当时没有弄成功,就弄了一个简单的demo,进行了测试。当然,用个“加载更多”的按钮,也是一种解决方案。

时间: 2024-08-09 06:03:12

[Angularjs]单页应用之分页的相关文章

[Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作

写在前面 前篇文章整理了angularjs学习目录,有园子里的朋友问我要这方面的demo,周末也没什么事,就在之前的单页应用的demo上面添加了增删改查的操作.代码比较简单,这里只列举比较重要的代码片段.完整的代码将在文章下面提供链接. demo 数据来源通过webapi的方式提供.获取对产品的查询,分页,增加商品,删除,修改等操作. webapi using Newtonsoft.Json; using System; using System.Collections.Generic; usi

[译]用AngularJS构建大型ASP.NET单页应用(一)

原文地址:http://www.codeproject.com/Articles/808213/Developing-a-Large-Scale-Application-with-a-Single 渣译,各位看官请勿喷 引言: ... 单页面应用程序(SPA),被定义为在一个独立的页面上??提供类似于桌面应用程序级用户体验为目标的网站.在SPA, 基本上所有的代码 - 例如 HTML,JavaScript和CSS - 都是在响应用户操作时动态加载的.页面没有在任何时候被重新刷新,也没有跳转到另一

[译]用AngularJS构建大型ASP.NET单页应用(二)

原文地址:http://www.codeproject.com/Articles/808213/Developing-a-Large-Scale-Application-with-a-Single 客户管理页面-新增.修改客户 单页应用中的页面与asp.net页面类似,两者都是html页面. 对于asp.net,浏览器加载html.js.数据,然后,浏览器进展示.而单页应用,页面内容通过ng-view 指令被注入到一个div标签中. 页面初始化时,浏览器通常只渲染html代码. 若在单页应用中使

[Angularjs]asp.net mvc+angularjs+web api单页应用

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 写在前面 最近的工作一直在弄一些h5的单页应用,然后嵌入到app的webview中.之前一直在用angularjs+html+ashx的一套东西.实在是玩腻了.然后就尝试通过asp.net mvc的方式构建单页应用.用到的技术angularjs

AngularJS实现单页应用的原理——路由(Route)

AngularJS实现单页应用的原理——路由(Route) 路由:告诉你一个通往某个特定页面的途径 http://127.0.0.1/index.html#/start http://127.0.0.1/index.html#/main #/start <=> start.html #/main <=> main.html SPA应用中的页面切换的原理: (1)使用JS解析当前的页面地址 location.hash( ) (2)查找字典,找到指定的路由地址对应的真正的页面名称 (3

用AngularJS构建单页应用,根据需求加载JS文件的方法

我们在AngularJS中可以根据网址不同直接切换view,动态加载网页模板,但是控制模板的控制器需要先定义好才可以,不能和网页模板同时加载,这样就造成整个网站的JS都要先加载完成. requireJS是大家第一个想到的东西,但是体积有点大,github上就有个人用它写了Angular的动态加载controller模块,是通过js promise异步编程技术实现的,最后的解决很简单~~ 首先在$routeProvider里面加resolve属性, $routeProvider. when('/p

Angular单页应用&amp;AngularJS内部实现原理

回顾 自定义指令 登录后获取登录信息session 首先在登录验证的时候保存一个user 在学生管理页面中运用ajax调用获取到登录的用户信息 对注销按钮添加点击事件:调用ajax在表现层给user赋值为null Angular实现单页应用 angular中实现单页应用是运用了UI-router插件 路由 后台中的路由是用来配置路径,分配请求的方法: angular中的路由也是同样的原理,通过导入ui-router插件,在main.js中配置不同的路由 实现方法 先导入ui-router文件 v

单页web应用(SPA)的简单介绍

单页 Web 应用 (single-page application 简称为 SPA) 是一种特殊的 Web 应用.它将所有的活动局限于一个Web页面中,仅在该Web页面初始化时加载相应的HTML.JavaScript 和 CSS.一旦页面加载完成了,SPA不会因为用户的操作而进行页面的重新加载或跳转.而是利用 JavaScript 动态的变换HTML的内(采用的是div切换显示和隐藏),从而实现UI与用户的交互.由于避免了页面的重新加载,SPA 可以提供较为流畅的用户体验.得益于ajax,我们

AJAX驱动的单页应用-Pub/Sub

有三样东西对AJAX驱动的单页应用很关键:时间委托.历史管理和通信模式(Pub/Sub). 首先让我们介绍一下Pub/Sub是个什么东西.我们可以把这个东西叫做广播,大概的意思就是当你发布了一个东西,那么其他的人就都能收到了.你可以想一下,一般说来在单页应用中,是高度模块化.那么就会涉及到一个通信的问题,按照以往的方式,我们会声明一个特定的对象,这个对象是专门用来作为模块之间的通信的.在使用了Pub/Sub之后,模块之间的通信就会是直接的通信,这样就能使结构变得清晰. PS:这种机制在angul