Backbone学习之todos实现

最近在读Addy Osmani的Developing Backbone.js Applications,读到了第一个栗子todos,必然要合上书自己再实现一遍。
书上用了一个backbone.localStorage插件,backbone还在初学,不想理会插件,先用window.localStorage直接原始的处理,之后在研究这个插件。

Model部分

todo.js

var app = app || {};

app.Todo = Backbone.Model.extend({
    defaults: {
        content: ‘‘,
        completed: false
    },
    //toggle完成状态
    toggle: function(bool) {
        if(bool === true) {
            this.set(‘completed‘, true);
        } else if(bool === false) {
            this.set(‘completed‘, false);
        } else {
            this.set(‘completed‘, !this.get(‘completed‘));
        }
    }
});

Collection部分

todos.js

var app = app || {};

(function () {
    var TodoList = Backbone.Collection.extend({
        model: app.Todo,
             //window.localStorage 
        storage: window.localStorage || null,

        initialize: function() {
            this.on(‘all‘, this.updateStorage);
        },

        remaining: function () {
            return this.filter(function (todo) {
                return todo.get(‘completed‘) === false;
            });
        },

        completed: function () {
            return this.where({completed: true});
        },
        //页面初始化时加载,用reset方法一次放入所有model,会触发collection的reset事件
        readStorage: function() {
            if (!this.storage) return;
            var todo_json = this.storage.getItem(‘todo‘);
            if (todo_json) this.reset(JSON.parse(todo_json));
        },
        //任何变动就更新storage的数据        //JSON.stringify,被转换对象如果有toJSON()方法,则转换toJSON()的返回值而不是当前对象了,Model的toJSON()返回它的attriubutes属性,Collection的toJSON(),返回包含所有内部model的attributes对象的数组
        updateStorage: function() {
            if (!this.storage) return;
            var todo_json = JSON.stringify(this);
            this.storage.setItem(‘todo‘, todo_json);
        }
    });

    app.todos = new TodoList();
})();

视图部分

item-view.js, 控制ul里每一项li

var app = app || {};

app.TodoView = Backbone.View.extend({
    tagName: ‘li‘,

    template: _.template($(‘#item-tpl‘).html()),
    //没有用keypress,非字符键不会触发keypress,捕捉不到ESC键。keydown返回键盘的代码,keypress是把keydown返回值翻译为ASCII码
    events: {
        ‘dblclick label‘: ‘edit‘,
        ‘click .toggle‘: ‘toggle‘,
        ‘blur .edit‘: ‘close‘,
        ‘keydown .edit‘: ‘updateOnEnter‘,   ‘click .clear‘: ‘clear‘
    },

    initialize: function() {
        this.listenTo(this.model, ‘change‘, this.render);
        this.listenTo(this.model, ‘destroy‘, this.remove);
    },

    render: function() {
        this.$el.html(this.template(this.model.toJSON()));
        this.$el.toggleClass(‘completed‘, this.model.get(‘completed‘));
        this.$edit = this.$(‘.edit‘);
        return this;
    },

    edit: function() {
        this.$el.addClass(‘editing‘);
        this.$edit.focus();
        this.$edit.select();
    },

    close: function() {
        var value = this.$edit.val();
        if(value.trim()) {
            this.model.set(‘content‘, value);
        } else {
            this.clear();
        }
        this.$el.removeClass(‘editing‘);
    },

    updateOnEnter: function(e) {
        if(e.which === ENTER_KEY) {
            this.close();
        } else if(e.which === ESC_KEY) {
            this.$el.removeClass(‘editing‘);
            this.$edit.val(this.model.get(‘content‘));
        }
    },

    clear: function() {
        this.model.destroy();
    },

    toggle: function() {
        this.model.toggle();
    }
});

app-view.js

var app = app || {};

app.AppView = Backbone.View.extend({
    el: ‘#todo-app‘,

    template: _.template($(‘#footer-tpl‘).html()),

    events: {
        ‘keydown #new-todo‘: ‘createOnEnter‘,
        ‘click #toggle-all‘: ‘toggleAll‘,
        ‘click .clear-completed‘: ‘clearCompleted‘
    },

    initialize: function () {
        this.$list = this.$(‘#todo-list‘);
        this.$new = this.$(‘#new-todo‘);
        this.allCheckbox = this.$(‘#toggle-all‘)[0];
        this.$main = this.$(‘#todo-main‘);
        this.$footer = this.$(‘#todo-footer‘);
        this.listenTo(app.todos, ‘add‘, this.addOne);
        this.listenTo(app.todos, ‘all‘, this.render);
        this.listenTo(app.todos, ‘reset‘, this.addAll);
        app.todos.readStorage();
    },

    render: function () {
        var remaining = app.todos.remaining().length,
            completed = app.todos.completed().length;

        this.$footer.html(this.template({
            remaining: remaining,
            completed: completed
        }));

        this.$clearCompleted = this.$(‘.clear-completed‘);

        this.allCheckbox.checked = !remaining;

        if (app.todos.length) {
            this.$main.show();
            this.$footer.show();
        } else {
            this.$main.hide();
            this.$footer.hide();
        }

        return this;
    },

    newAttributes: function () {
        return {
            content: this.$new.val(),
            completed: false
        }
    },

    addOne: function (todo) {
        var view = new app.TodoView({model: todo});
        this.$list.append(view.render().el);
    },

    addAll: function(todos) {
        todos.each(function(todo) {
            this.addOne(todo);
        }, this);
    },

    createOnEnter: function (e) {
        if (e.which === ENTER_KEY && this.$new.val().trim() != "") {
            app.todos.add(this.newAttributes());
            this.$new.val(‘‘);
        }
    },

    clearCompleted: function () {
        app.todos.completed().forEach(function (todo) {
            todo.destroy();
        });
    },

    toggleAll: function () {
        var value = this.allCheckbox.checked;
        app.todos.forEach(function (todo) {
            todo.toggle(value);
        }, this);
    }
});

最后,index.js

var ENTER_KEY = 13,
    ESC_KEY = 27,
    app = app || {};

$(function() {
    new app.AppView();
});
时间: 2024-10-04 19:44:19

Backbone学习之todos实现的相关文章

Backbone学习笔记一Backbone中的MVC

原文章地址http://bigdots.github.io/2015/12/01/Backbone学习笔记(一)/#more Backbone.js为复杂WEB应用程序提供模型(models).集合(collections).视图(views)的结构.其中models用于绑定键值数据和自定义事件:collections附有可枚举函数的丰富API: views可以声明事件处理函数,并通过RESRful JSON接口连接到应用程序. 下面通过实例来学习backbone的MVC.实例来自http://

Backbone学习笔记

MVC 爱创课堂今日分享-Backbone学习笔记 M表示模型V表示视图C表示控制器MVC最早出现在smalltalk语言中,MVC分别表示模型,视图,控制器,模型通常指的是数据,视图通常是它能看到的页面,控制器通常表示一些交互等等,MVC根据前后端的划分,又有不同的含义对于后端来说M(Model)模型,通常指的是底层的数据,例如对数据库操作数据的封装等V(View)视图,向前端输出的视图等等,包括渲染视图,创建视图等等C(Controller)控制器,指的是对模型以及视图的操作,例如获取请求,

backbone学习时练习的简单示例

现在js MVC模式大行其道,像backbone,angularjs都是一个好的jsMVC框架.在学习backbone时,看了一下todo示例,写了一个简单的增删改查的示例,其中用到bootstrap做界面.练习一下! 列表页面 新增或修改页面 1 <!DOCTYPE html> 2 <html lang="zh-CN"> 3 <head> 4 <meta charset="utf-8"> 5 <meta htt

Backbone学习日记第二集——Model

看到Model给我的第一感觉就是实体,以前大学的时候学习.Net 三层架构的时候经常和Model打交道,现在工作中用到ASP.NET MVC中的M也是Model,嗦很自然的就想这个Model和他们之间相连接起来,但是又有些许不同,比如backbone中的Model.controller.View都在同一个文件中,而.net中的M是单独的一个或多个类文件.在backbone中要构建一个Model很简单,只需要继承一下Model就搞定,比如:var model=Backbone.Model.exte

Backbone学习日记第一集——hello backbone

由于工作项目的需要用到backbone.js这个MVC框架,所以前段时间一直在网上收集了好久资料,但是都没什么好一点的,偶然间发现了www.the5fire.com网站上有backbone全套的教程,于是又当回剁手族买了本电子书,但是诸多原因一直没怎么看,今天在公交车上无聊,翻了翻手机突然想起来了这本书,在车上看了2个章节,还不错,有激起了我对他的学习欲望,回到家就迫不及待的收拾完家务,开始code. 下面是我今天晚上照着例子写了一个hello Backbone的Demo 1 <!DOCTYPE

Backbone 学习笔记

Backbone 是一款基于模型-视图-控制器 MVC 模式的轻量级javascript 框架 ,可以用来帮助开发人员创建单页Web应用. 借助Backbone 我们可以使用REST的方式来最小化客户端和服务器间的数据传输,从而实现了更快加速的Web页面更新. 能心静下来学习了,以前以为Backbone 是一座高山用起来很难,结果只是学了2天就有一些新的,实在让人开心. 我整理了一下整个BackBone的学习记录在我的GIT里面,大部分事件都有例子并且有详细的注解和解释,结合require.js

Backbone学习笔记 - View篇

Backbone是一种Web端的MVC框架,这里纪录学习Model,View和Collection的笔记. 1 View initialize构造函数 Backbone.View 与jQuery库紧密结合. var SearchView = Backbone.View.extend({ initialize:function(){ alert("Alerts suck."); } }); var search_view = new SearchView(); initialize 就类

backbone学习

backbone里很多思想都与后台有关,如果有后台语言基础的学习起来比较简单. 它是一个MVVM模型,因为我觉得前端MVVM,比MVC好理解,虽然它也是MVC,但 C的概念很模糊,因为前端mvc的c很不好理解,但mvvm就很简单. backbone很多方法都要自己new,就像你做了个模子,然后不断的印出你要的样子. backbone-Model <!DOCTYPE html> <html lang="en"> <head> <meta char

Backbone学习日记[2]:后台(php)接收前端数据并保存

一.前端定义一个模型,设置一个url,指向提供保存数据功能的后台文件,给模型设置一个默认值:实例化模型,调用save方法: <script type="text/javascript" src="jquery.min.full.js"></script> <script type="text/javascript" src="Underscore.js"></script> &l