最近一个项目用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的分页模板的更多相关文章

  1. 自己动手写 ASP.NET MVC 分页 part1

    学习编程也有一年半载了,从来没有自己动手写过东西,都是利用搜索软件找代码,最近偶发感慨,难道真的继续做码农??? 突发奇想是不是该自己动手写点东西,可是算法.逻辑思维都太弱了,只能copy网上的代码, ...

  2. 动手写一个简单的Web框架(模板渲染)

    动手写一个简单的Web框架(模板渲染) 在百度上搜索jinja2,显示的大部分内容都是jinja2的渲染语法,这个不是Web框架需要做的事,最终,居然在Werkzeug的官方文档里找到模板渲染的代码. ...

  3. smarty分页模板(用模板语法写分页)

    分页是一个我们经常要用到的.比较基本的小功能,你可以通过定义一个方法或类来对它进行封装.重用.而本文则是通过利用smarty独有的语法,以模版的方式进行封装,从而达到同样的目的. 下面开始具体实现步骤 ...

  4. 【Java EE 学习 57】【酒店会员管理系统之分页模板书写】

    分页一直是一个比较麻烦的问题,特别是在我做的这个系统中更是有大量的分页,为了应对该问题,特地写了一个模板以方便代码重用,该模板包括后台分页的模板.前端显示的模板两部分. 一.分页分析 分页需要三种类型 ...

  5. 自己动手写PHP MVC框架

    自己动手写PHP MVC框架 来自:yuansir-web.com / yuansir@live.cn 代码下载: https://github.com/yuansir/tiny-php-framew ...

  6. KnockOut文档--模板绑定

    目的 模板绑定使用数据render模板,然后把渲染的结果填充到Dom树中.模板通过重复或嵌套块(通常为您的视图模型数据的函数)用一种简单,方便的方式来建立复杂的UI结构 . 有两种方式使用模板: Na ...

  7. 自己动手写Vector【Cherno C++教程】

    动手写一个Vector 本文是对<最好的C++教程>的动手写数据结构部分的一个整理,主要包含91p动手写Array数组和92p动手写Vector数组的内容. 自己动手来写这些数据结构是学习 ...

  8. 【原创】自己动手写控件----XSmartNote控件

    一.前面的话 在上一篇博文自己动手写工具----XSmartNote [Beta 3.0]中,用到了若干个自定义控件,其中包含用于显示Note内容的简单的Label扩展控件,用于展示标签内容的labe ...

  9. 【原创】自己动手写工具----XSmartNote [Beta 3.0]

    一.前面的话 在动笔之前,一直很纠结到底要不要继续完成这个工具,因为上次给它码代码还是一年多之前的事情,参考自己动手写工具----XSmartNote [Beta 2.0],这篇博文里,很多园友提出了 ...

随机推荐

  1. jQuery表格排序总成-tablesorter

    一个.进口单证 <script type="text/javascript" src="js/jquery.js"></script> ...

  2. java中的执行顺序

    静态,非静态,构造,先父再子另外,静态块与静态变量的顺序取决于代码中的顺序 Comparable接口应用

  3. poj 1328 Radar Installation (简单的贪心)

    Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42925   Accepted: 94 ...

  4. java回顾4 Java基本数据类型

    为JAVA基本数据类型.我的实在是有兴趣引用数据类型.在这里,我说的是主应用程序数据类型. 为JAVA荐两个网址: 1.http://blog.sina.com.cn/s/blog_745b874b0 ...

  5. React.js再探(三)

    很多时候,组件实例的外观和行为我们通过props进行定制就可以了.因为任何时候,组件实例的表现只跟 传过来的props属性 相关. 我们称这种为 无状态/ stateless 组件 即它自身是 无记忆 ...

  6. 运用TWaver 3D 矢量图形处理能力

    的确,提起TWaver,大家想到的首先是"电信拓扑图组件".事实上.因为其灵活的MVC架构.矢量化设计.方便定制等特点.TWaver能够做的还有非常多.比如房地产行业常见到的&qu ...

  7. form表单target的用法,实现无刷新提交页面

    form表单的target,当将iframe设置为隐藏时,可以实现当前页表单提交而不进行跳转刷新.代码如下,首页在页面里准备一个form表单和一个iframe. <form action=&qu ...

  8. 开发者:网站 & SDK

    { 收集的一些.开发工具 } Teambition 团队协作工具 GitCafe 代码托管 FIR.im App 托管平台 Coding 代码托管,项目管理,WebIDE 计蒜客 编程学习 SendC ...

  9. Webbrowser控件史上最强技巧全集

    原文:Webbrowser控件史上最强技巧全集 Webbrowser控件史上最强技巧全集 VB调用webbrowser技巧集 1.获得浏览器信息: Private Sub Command1_Click ...

  10. [Unity3D]Unity3D游戏开发Android内嵌视图Unity查看

    ---------------------------------------------------------------------------------------------------- ...