动动手,写个knockout的分页模板
最近一个项目用ASP.NET + knockout开发,很多列表页面都带分页,于是就有了写一个公共的分页模板的想法。
先把template写好:
<script type="text/html" id="PaginationTemplate" >
<div class="pagination" data-bind="visible: pages().length>0">
<div>
<ul>
<li><a data-bind="click:goToFirst" onclick="clickPaging(this)">首页</a></li>
<li><a data-bind="click:goToPrev" onclick="clickPaging(this)" ><<</a></li>
<!--ko if:showStartPagerDot-->
<li><a >...</a></li>
<!--/ko-->
<!--ko foreach:pages-->
<li data-bind="css: { 'active': $data == $parent.currentPage() }">
@*<a data-bind="text: $data, click: $parent.goToPage.bind($data, $data)" onclick="clickPaging(this)"></a>*@
<a data-bind="text: $data, click: $parent.goToPage.bind($data, $data),style:{'background-color':$('.pagination a').length=='5'?'#CE9E00':'#194DB0'}" onclick="clickPaging(this)"></a>
</li>
<!--/ko-->
<!--ko if:showEndPagerDot-->
<li><a>...</a></li>
<!--/ko-->
<li><a data-bind="click: goToNext" onclick="clickPaging(this)">>></a></li>
<li><a data-bind="click:goToLast" onclick="clickPaging(this)">末页</a></li>
</ul>
<ul>
<li><span >跳转</span></li>
<li>
<input type="text" class="h_20 w_30 txtStl1 mg_t_neg2 " id="pagex" data-bind="value:jumpPage"/>
</li>
<li>
<span data-bind="click: jump" onclick="clickPaging(this)">
@*<button class="btnStl1" type="button" data-bind="click: jump">确定</button></span>*@确定</span> </li>
<li><span data-bind="text: formatedPageCount"></span></li>
</ul>
</div>
<div class="clear"></div>
</div> </script>
接下来就是写knockout的视图模型了:
function paginationViewModel(pageSize, goToPageHandler) {
    var self = this, pagerCount = 8;//如果分页的页面太多,截取部分页面进行显示,默认设置显示9个页面
    self.pageSize = pageSize;//每页显示的记录数
    self.currentPage = ko.observable(1);//当前页面Index
    self.jumpPage = ko.observable(1);//需要跳转的页面的Index
    self.pageCount = ko.observable(0);//总页数
    self.showStartPagerDot = ko.observable(false);//页面开始部分是否显示点号
    self.showEndPagerDot = ko.observable(false);//页面结束部分是否显示点号
    self.pages = ko.observable([]);//需要显示的页面数量
    //计算需要显示的页面的页码
    self.caculatePages = function () {
        var result = [], pagerCount = 8, start = 1, end = pagerCount;
        if (self.currentPage() >= pagerCount) {
            start = self.currentPage() - Math.floor(pagerCount / 2);
            self.showStartPagerDot(true);
        } else {
            self.showStartPagerDot(false);
        };
        end = start + pagerCount - 1;
        if (end > self.pageCount()) {
            end = self.pageCount();
            self.showEndPagerDot(false);
        } else {
            self.showEndPagerDot(true);
        };
        for (var i = start; i <= end; i++) {
            result.push(i);
        };
        self.pages(result);
    }
    //总页数
    self.formatedPageCount = ko.computed(function () {
        return "共" + self.pageCount() + "页";
    });
    //页面跳转
    self.goToPageHandler = goToPageHandler;
    self.goToPage = function (page) {
        if (typeof self.goToPageHandler == "function") {
            self.goToPageHandler.call(self, page - 1, function (data) {
                self.pageCount(Math.ceil(data.count / self.pageSize));
                self.currentPage(page);
                self.jumpPage(null);
                self.caculatePages();
            });
        };
    };
    //回到首页
    self.goToFirst = function () {
        self.goToPage(1);
    };
    //跳转到最后一页
    self.goToLast = function () {
        self.goToPage(self.pageCount());
    };
    //上一页
    self.goToPrev = function () {
        var cur = self.currentPage();
        if (cur > 1) {
            self.goToPage(cur - 1);
        };
    };
    //下一页
    self.goToNext = function () {
        var cur = self.currentPage();
        if (cur < self.pageCount()) {
            self.goToPage(cur + 1);
        };
    };
    //跳转
    self.jump = function () {
        var page = self.jumpPage();
        if (page > 0 && page <= self.pageCount()) {
            self.goToPage(page);
        };
    };
};
然后直接用列表页面的viewModel继承这个视图模型:
paginationViewModel.apply(self, [10, function (page, pageHandler) {
            ajaxQueue.Request("UserQuaList", {
                url: self.baseUri,
                data:{
                    userName:self.userName()||"",
                    quaName:self.quaName()||"",
                    pageIndex:page,
                    pageSize:self.pageSize
                },
                success: function (data) {
                    pageHandler.call(self, data);
                    self.userQuas($.map(data.list || [], function (r) { return new userQuaModel(r); }));
                }
            }).Run();
        }]);
页面上分页部分用template绑定:
<td colspan="5" data-bind="template: 'PaginationTemplate'"></td>
大功告成!,试了一下,还不错,以后还可以再加点效果上去。
应大家要求,整了一个Demo源代码:
动动手,写个knockout的分页模板的更多相关文章
- 自己动手写 ASP.NET MVC 分页     part1
		学习编程也有一年半载了,从来没有自己动手写过东西,都是利用搜索软件找代码,最近偶发感慨,难道真的继续做码农??? 突发奇想是不是该自己动手写点东西,可是算法.逻辑思维都太弱了,只能copy网上的代码, ... 
- 动手写一个简单的Web框架(模板渲染)
		动手写一个简单的Web框架(模板渲染) 在百度上搜索jinja2,显示的大部分内容都是jinja2的渲染语法,这个不是Web框架需要做的事,最终,居然在Werkzeug的官方文档里找到模板渲染的代码. ... 
- smarty分页模板(用模板语法写分页)
		分页是一个我们经常要用到的.比较基本的小功能,你可以通过定义一个方法或类来对它进行封装.重用.而本文则是通过利用smarty独有的语法,以模版的方式进行封装,从而达到同样的目的. 下面开始具体实现步骤 ... 
- 【Java EE 学习 57】【酒店会员管理系统之分页模板书写】
		分页一直是一个比较麻烦的问题,特别是在我做的这个系统中更是有大量的分页,为了应对该问题,特地写了一个模板以方便代码重用,该模板包括后台分页的模板.前端显示的模板两部分. 一.分页分析 分页需要三种类型 ... 
- 自己动手写PHP MVC框架
		自己动手写PHP MVC框架 来自:yuansir-web.com / yuansir@live.cn 代码下载: https://github.com/yuansir/tiny-php-framew ... 
- KnockOut文档--模板绑定
		目的 模板绑定使用数据render模板,然后把渲染的结果填充到Dom树中.模板通过重复或嵌套块(通常为您的视图模型数据的函数)用一种简单,方便的方式来建立复杂的UI结构 . 有两种方式使用模板: Na ... 
- 自己动手写Vector【Cherno C++教程】
		动手写一个Vector 本文是对<最好的C++教程>的动手写数据结构部分的一个整理,主要包含91p动手写Array数组和92p动手写Vector数组的内容. 自己动手来写这些数据结构是学习 ... 
- 【原创】自己动手写控件----XSmartNote控件
		一.前面的话 在上一篇博文自己动手写工具----XSmartNote [Beta 3.0]中,用到了若干个自定义控件,其中包含用于显示Note内容的简单的Label扩展控件,用于展示标签内容的labe ... 
- 【原创】自己动手写工具----XSmartNote [Beta 3.0]
		一.前面的话 在动笔之前,一直很纠结到底要不要继续完成这个工具,因为上次给它码代码还是一年多之前的事情,参考自己动手写工具----XSmartNote [Beta 2.0],这篇博文里,很多园友提出了 ... 
随机推荐
- 用C#绘图实现动画出现卡屏(运行慢)问题的解决办法
			原文:用C#绘图实现动画出现卡屏(运行慢)问题的解决办法 正在用C#做一个小游戏,需要用到动画,上次解决的问题是闪烁问题,用双缓冲技术.以为不会有什么问题了.后来当把图片全部绘制上去的时候依然出现了卡 ... 
- GPS转换为百度坐标
			原文地址:http://www.cnblogs.com/zhaohuionly/archive/2013/06/18/3142623.html 最近在做一个关于手机定位的小应用,需求是这样的,用户通过 ... 
- 求解决!!!SystemVerilog于ModelSim在编译和执行
			我们正在学习SV流程,样品执行书.. 功能:函数返回数组. Code1: /*书上提供的样例.存在错误,不可执行 function void init(ref int f[5], int start) ... 
- JAVA于Get和Post差异请求
			1. get 离server在对数据的访问.post 它是对server数据的传输. get 请求返回 request - URI 随机信息指出,. Post 请求发送电子邮件.观看新闻或交互式用户发 ... 
- POJ 3299 Humidex(简单的问题)
			[简要题意]:什么是温度,湿度--,之间的转换.. [分析]:式已被赋予. // 252k 0Ms /* 当中exp表示的是求e的x次幂 解法就直接依据题目中的公式解决就好!! */ #include ... 
- 归并排序 & 快速排序
			归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有 ... 
- MyReport报表引擎2.7.6.7新功能
			新增二维码控件PDF417 设计器新增数据选项卡,可以拖放字段进行绑定 相关链接 MyReport演示.产品站点 相关文章 MyReport专栏 
- Android学习之 WebView使用小结
			这段时间基于项目须要 在开发中与WebView的接触比較多,前段时间关于HTML5规范尘埃落定的消息出如今各大IT社区头版上,更有人说:HTML5将颠覆原生App开发 尽管我不太认同这一点 可是关于H ... 
- 退出手机QQ依旧显示在线
			老婆说明明看到你手机QQ在线,怎么发信息不回复?这让我非常是冤枉,我明明退出了啊! 晚上宝宝睡觉后,我们一起来研究,发现了当中的秘密,原来仅仅要选择了"退出后仍接受消息通知"这个选 ... 
- 第4章2节《MonkeyRunner源码剖析》ADB协议及服务: ADB服务SERVICES.TXT翻译参考(原创)
			天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 MonkeyRunner>书籍“.但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在 ... 
