动动手,写个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],这篇博文里,很多园友提出了 ...
随机推荐
- 你真的会玩SQL吗?Case的用法(转)
今天来总结整理一下Case,因为SQL查询中用得最多的逻辑判断. Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' ...
- -Android的发展webservice-号码归属地查询
代码地址:http://download.csdn.net/detail/jiangliqing1234/8027039 流程具体解释:http://blog.csdn.net/lyq8479/art ...
- 考试easy该,学习如何做?
我的两个学生(场和任)都讲了他们周末參加的一个认证考试不考大题考小题的事情.由感而发: 话说不用大题考,大概是不敢用大题考. 老师的教.和学生的学中.存在的一些问题得不到解决,整体讲,学生的学习效果没 ...
- Python输出文件由线解释和扩展的具体内容
结束此处的测试代码中作者写的,第一段包含不正确的版本号,后者是正确的版本号: #! /usr/bin/python2.7 try: filename = raw_input('please i ...
- Drupal 7.31 SQL注射分析POC
此漏洞昨日爆发 ,我们有时间去看看今天的代码. 于Drupal于,跑sql声明使用PDO型号,这是一般能够避免大部分的注射,由于使用占位符的sql语法语句是限制. 但是,这并不意味着绝对安全,. 在D ...
- 多重集组合数 (DP)
输入: n=3 m=3 a={1,2,3} M=10000 输出: 6 (0+0+3,0+1+2,0+2+1,1+0+2,1+1+1,1+2+0) 为了不重复计数,同一种类的物品最好一次性处理好.于 ...
- 怪异php 语法, 求解!
查找php馍用来推断是否串串返回值和方法 strpos很奇怪. 请看下面的语句: echo "A1: ".(strpos("csd","c" ...
- [MySQL]-->查询5天之内过生日的同事中的闰年2月29日问题的解决过程
前言: 上次写了查询5天之内过生日的同事中的跨年问题的解决过程,网址为:http://blog.csdn.net/mchdba/article/details/38952033 ,当中漏了一个闰年2月 ...
- swift 注意事项 (十六) —— 可选链
可选链(Optional Chaining) 我们都知道"可选型"是什么.那么可选链又是什么,举个样例解释一下: struct MyName{ var name } st ...
- 【百度地图API】多家地图API内存消耗对比测验(带源码)
原文:[百度地图API]多家地图API内存消耗对比测验(带源码) 任务描述: 啊,美妙的春节结束了.酸奶小妹和妈妈的山西平遥之旅也宣告成功!距离平遥古城7km,有一个同样身为“世界文化遗产”的寺庙,叫 ...