Backbone 自制分页组件

文件有:pagination.js 分页逻辑  paginationModel 分页数据模型  pagination.html  html模版

pagination.js 相关代码

define(function (require, exports, modules) {
    'use strict';


    var tpl = require('text!./pagination.html');

    var view = Backbone.View.extend({

        template: _.template(tpl),
        events:{
           'click li,.page-btn':'changePageTrigger',
            'blur .unify-page-size input':'changePageSize',
            'click .unify-page-goto button':'gotoPageNum',
            'keypress .unify-page-size input':'keySizeChange',
            'keypress .unify-page-goto input':'keyNumChange'
        },
        initialize: function () {

            _.bindAll(this,'changePageTrigger','changePageSize','gotoPageNum','keySizeChange','keyNumChange');
            this.listenTo(this.model, 'change', this.render);
        },
        render: function () {
            // 初始化viewer 并渲染
            this.$el.html(this.template(this.model.toJSON()));

            return this;
        },
        changePageTrigger:function(e){  

            e.preventDefault();
            var self = $(e.currentTarget);
            var pageNum = '';
            if(self.hasClass('disabled')) return false;

            if(self.hasClass('page-num')){
                pageNum = self.text();
            }else if(self.hasClass('previous')){

                pageNum = this.model.get('pageNum')-1;

            }else if(self.hasClass('next')){
                pageNum = this.model.get('pageNum') + 1;
            }

            this.gotoPageNum(Number(pageNum));

        },
        keySizeChange:function(event){
            if(event.keyCode == "13")
            {
                this.changePageSize(event);
            }
        },
        keyNumChange:function(event){
            if(event.keyCode == "13")
            {
                this.gotoPageNum();
            }
        },
        changePageSize:function(event){  //更改页面页数大小

            var self = $(event.currentTarget);
            if(self.val() > 1000000000){
                unifyComponent.unifyWarn("每页条数不能超过10亿");
                return false;
            }

            if(self.val()!="" && (!/^[0-9]*$/.test(self.val()))){ // 验证数字
                unifyComponent.unifyWarn("每页条数必须是整数");
                return false;
            }
            if(self.val() == 0){
                unifyComponent.unifyWarn("每页条数不能为0");
                return false;
            }
            if(this.model.get('pageSize') != self.val()){
                var pageCount = Math.ceil(this.model.get('totalCount') / self.val());

                var json =  _.extend({},this.model.toJSON(),{pageCount:pageCount,pageSize:self.val()});
                this.model.setBeforeHandle(json,true);
                this.trigger('page', this.model.toJSON());  // 触发函数
            }
        },

        gotoPageNum:function(pageNum){ //更改页面当前页

            var page = _.isNumber(pageNum) ? pageNum : parseInt(this.$el.find('.unify-page-goto input').val());
            if(page > 1000000000){
                unifyComponent.unifyWarn("输入页数不能超过10亿");
                return false;
            }


            if(page!="" && (!/^[0-9]*$/.test(page))){ // 验证数字
                unifyComponent.unifyWarn("页数必须是整数");
                return false;
            }

            if(!page || page > this.model.get('pageCount')){
                unifyComponent.unifyWarn('输入错误超过总页数或者没输入');
                return false;
            }
            var json = _.extend({},this.model.toJSON(),{pageNum:page});
            this.model.setBeforeHandle(json); 

            this.trigger('page', this.model.toJSON()); // 触发函数

        }

    });

    return view;

});

  paginationModel 对应代码

  

/**
 * Created by carey on 16/6/28.
 */

define(function (require, exports, modules) {
    'use strict';


    var Model = Backbone.Model.extend({

        defaults:{

            first:false,//第一页
            last:true, //最后一页
            prev:false,//上一页
            next:true,//下一页
            hasPrevMore:false,  //是否有上一页
            hasNextMore:false, //是否有下一页
            visiblePages:5,// 展示页数宽带
            startPage:1,
            pageNum:1,
            pageSize:10,
            totalCount:0,
            pageCount:-1
        },
        getRequestPage:function(flag){

            var page = {};

            if(flag){
                this.set({pageNum:1,startPage:1},{silent:false});
            }

            page.pageNum = this.get('pageNum');
            page.pageSize = this.get('pageSize');
            // page.pageCount = this.get('pageCount');
            return {page:page};
        },
        setBeforeHandle:function(json){


            if( (json.pageNum == this.get('pageNum') && json.pageSize == this.get('pageSize') && json.pageCount == this.get('pageCount') && json.totalCount == this.get('totalCount'))){

                return false;
            }


            json.prev = !(json.pageNum == 1);
            json.next = !(json.pageNum == json.pageCount);

            if(json.visiblePages >= json.pageCount || json.pageCount < 5){
                json.visiblePages = json.pageCount;
                json.hasPrevMore = false;
                json.hasNextMore = false;

                this.set(json);

                return false;
            }else{
                json.visiblePages = 5;
            }



            if((json.pageNum + json.visiblePages) >= json.pageCount) {

                json.startPage = json.pageCount - json.visiblePages+1;
            }

            var lastNum = json.visiblePages + json.startPage - 1;


            if(lastNum <= json.pageNum && lastNum != json.pageCount){
                json.startPage =  json.pageNum + 1;
                lastNum++;
            }

            json.hasNextMore = lastNum < json.pageCount;

            if(json.startPage >= json.pageNum && json.startPage != 1){

                json.startPage = json.pageNum == 1 ? json.pageNum : json.pageNum - 1;
            }


            json.hasPrevMore = json.startPage > 1;


            this.set(json);

        }

    });

    return Model;

});

  pagination.html 对应代码

<%if(pageCount > 1 || totalCount > 10){%>

<div class="unify-page">
    <div class="unify-page-inner">
        <div class="unify-page-num">
            <ul>
                <li class="previous <%=prev ? '' : 'disabled'%>"><a>上一页</a></li>

                <%for(var i = startPage; i < visiblePages + startPage; i++){%>
                <%if(i == pageNum){%>
                <li class="page-num num active"><a href=""><%=i%></a></li>
                <%}else{%>
                <li class="page-num num"><a  href=""><%=i%></a></li>
                <%}%>
                <%}%>
                <li class="next <%=next ? '' : 'disabled'%>" ><a class="">下一页</a></li>
            </ul>
        </div>
        <div class="unify-page-goto">
            <input type="text" value="<%=pageNum%>" /><button>GO</button>
        </div>
        <div class="unify-page-info">
            共<%=pageCount%>页  <%if(totalCount==10001){%>共10000+条<%}else{%>共<%=totalCount%>条<%}%>
        </div>
        <div class="unify-page-size">
            每页显示 <input type="text" value="<%=pageSize%>"/> 条
        </div>
    </div>
</div>

<%}%>

  

转载于:https://www.cnblogs.com/careyyibu/p/8520839.html

---------------- backbone开发经典 336页清晰完整版pdf-------------- 内容简介 · · · · · · backbone.js提供了一套web开发的框架,为复杂javascript应用程序提供一个mvc结构。 《backbone.js应用程序开发》详细介绍了如何使用backbone.js完成web应用开发。全书从了解mvc、spa和backbone.js的基本知识开始,然后着手构建3个示例应用程序;此外,backbone和grunt-bbb、jquery mobile等开发工具的配合使用,以及jasmine、qunit和sinonjs等测试解决方案。 本书的作者是知名的javascript专家、谷歌chrome团队的工程师addy osmani。本书适合于javascript程序员、web开发人员,尤其是想要学习和使用backbone.js的读者阅读参考。 如果你想使用单页应用程序(spa)模型创建前端站点,本书向你展示了如何使用backbone.js完成这类工作。你将学会使用backbone自有风格的模型-视图-控制器(mvc)架构,来创建结构化的javascript应用程序。 《backbone.js应用程序开发》先从了解mvc、spa和backbone的基本知识开始,然后着手构建示例应用程序——一个简单的todo列表应用程序、restful风格的图书应用程序、以及使用backbone和requirejs的模块化应用程序。本书的作者是谷歌chrome团队的工程师addy osmani,他还演示了框架的高级应用。 《backbone.js应用程序开发》包括以下内容: 了解backbone.js如何给客户端带来mvc方面的好处; 编写易于阅读的、结构化的和易扩展代码 ; 使用backbone.marionette和thorax扩展框架; 解决使用backbone.js时会遇到的常见问题; 使用amd和requirejs将代码进行模块化组织; 使用backbone.paginator插件为collections数据分页; 使用样板代码引导新的backbone.js应用程序; 使用jquery mobile,并解决两者之间的路由问题; 使用jasmine、qunit和sinonjs对backbone应用进行单元测试。 作者简介 · · · · · · Addy Osmani,本书的作者是知名的JavaScript专家、谷歌Chrome团队的工程师,他对JavaScript应用程序架构有着强烈的爱好,还创建了一些比较流行的项目,如TodoMVC,并且对Yeoman、Modernizr和jQuery等其他开源项目也有重要贡献。除此之外,Addy Osmani也是一位高产的博主(http://addyosmani.com/blog),同时也是O'reilly出版的《JavaScript设计模式》一书的作者。 徐涛(网名:汤姆大叔;微博:@TomXuTao),微软最有价值专家(MVP)、项目经理、软件架构师,擅长大型互联网产品的架构与设计,崇尚敏捷开发模式,熟悉设计模式、前端技术、以及各种开源产品,曾获MCP、MCSE、MCDBA、MCTS、MCITP、MCPD、PMP认证。《JavaScript编程精解》、《JavaScript启示录》译者,博客地址:Http://www.cnblogs.com/TomXu。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值