博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】Backbone标准例子——通讯录
阅读量:5992 次
发布时间:2019-06-20

本文共 8055 字,大约阅读时间需要 26 分钟。

参考:http://z2009zxiaolong.iteye.com/blog/1847833

感觉不错的例子,模型、视图、路由等知识点都用到了:),将此文中的源码转载如下:

http://dmyz.org/archives/598 这篇教程也不错,讲的很清楚。

//------------------------------------------------------------------------------------

backbone.js源码初略:

backbone.js相当轻量级,以其0.5.1 版本为例,总代码不过1100行左右。主要代码包括:

event:定义一个event和callback的list,实现时间的增、删即回调;

async:封装http的post\delete\get\update方法;

model:定义数据模型对象,主要是其属性(比如url)以及关键的回调,比如fetch会调用async模块的ajax方法获取数据,并执行回调;

collection:是model的集合,在这个集合中实现了一堆方法的扩展接口,例如foreach,each,map等等;

route:定义一个route列表,操作时会相应操作history对象,实现历史跳转;

view:对应视图,主要是获取其中的DOM组件并渲染,同时处理绑定在view上的事件;

//-------------------------------------------------------------------------------------

  
Backbone通讯录
(function($) {  $(document).ready(function() {    var Contact = Backbone.Model.extend({      defaults: {        name: '',        email: ''      },      validate: function(attrs, options) {        if (attrs.name == "") {          return "用户名不能为空!";        };      },      // 用户搜索的辅助方法      filter: function(query) {        if (typeof(query) === 'undefined' || query === null || query === '') return true;        query = query.toLowerCase();        return this.get('name').toLowerCase().indexOf(query) != -1 || this.get('email').toLowerCase().indexOf(query) != -1;      }    });    var Contacts = Backbone.Collection.extend({      model: Contact,      localStorage: new Store('my-contacts')    });    // 单个联系人视图    var ContactItemView = Backbone.View.extend({      className: 'item',      template: _.template($('#tpl-item').html()),      events: {        'click': 'select'      },      initialize: function() {        _.bindAll(this, 'select');        this.model.bind('reset', this.render, this);        this.model.bind('change', this.render, this);        this.model.bind('destroy', this.remove, this);        if (this.model.view) this.model.view.remove();        this.model.view = this;      },      // 渲染联系人      render: function() {        this.$el.html(this.template(this.model.toJSON()));        return this;      },      select: function() {        appRouter.navigate('contacts/' + this.model.cid, {          trigger: true        });      },      active: function() {        this.$el.addClass('active');      },            deactive: function() {        this.$el.removeClass('active');      }    });    // 左边的侧边条视图    var SidebarView = Backbone.View.extend({      className: 'sidebar',      template: _.template($('#tpl-sidebar').html()),      events: {        'click footer button': 'create',        'click input': 'filter',        'keyup input': 'filter'      },      initialize: function() {        _.bindAll(this, 'create', 'filter');        this.model.bind('reset', this.renderAll, this);        this.model.bind('add', this.add, this);        this.model.bind('remove', this.remove, this);      },      // 渲染联系人列表      render: function() {        $(this.el).html(this.template());        this.renderAll();        return this;      },      renderAll: function() {        this.$(".items").empty();        this.model.each(this.renderOne, this);        this.filter();      },      renderOne: function(contact) {        var view = new ContactItemView({          model: contact        });        this.$(".items").append(view.render().el);      },      create: function() {        var contact = new Contact();        this.model.add(contact);        appRouter.navigate('contacts/' + contact.cid + '/edit', {          trigger: true        });      },      filter: function() {        var query = $('input', this.el).val();        this.model.each(function(contact, element, index, list) {          contact.view.$el.toggle(contact.filter(query));        });        // this.model.last().view.$el.trigger("click")      },      active: function(item) {        if (this.activeItem) this.activeItem.view.deactive();        this.activeItem = item;        if (this.activeItem) this.activeItem.view.active();      },      add: function(contact) {        this.renderOne(contact);      },      remove: function(contact) {        console.log(contact);      }    });    // 显示选择的联系人详细信息    var ShowView = Backbone.View.extend({      className: 'show',      template: _.template($('#tpl-show').html()),      events: {        'click .edit': 'edit'      },      initialize: function() {        _.bindAll(this, 'edit');      },      render: function() {        if (this.item) this.$el.html(this.template(this.item.toJSON()));        return this;      },      change: function(item) {        this.item = item;        this.render();      },      edit: function() {        if (this.item) appRouter.navigate('contacts/' + this.item.cid + '/edit', {          trigger: true        });      }    });        // 编辑选择的联系人    var EditView = Backbone.View.extend({      className: 'edit',      template: _.template($('#tpl-edit').html()),      events: {        'submit form': 'submit',        'click .save': 'submit',        'click .delete': 'remove'      },      initialize: function() {        _.bindAll(this, 'submit', 'remove');      },      render: function() {        if (this.item) this.$el.html(this.template(this.item.toJSON()));        return this;      },      change: function(item) {        this.item = item;        this.render();      },      submit: function() {        this.item.set(this.form());        this.item.save();        appRouter.navigate('contacts/' + this.item.cid, {          trigger: true        });        return false;      },      form: function() {        return {          name: this.$('form [name="name"]').val(),          email: this.$('form [name="email"]').val()        };      },      remove: function() {        this.item.destroy();        this.item = null;        appRouter.navigate('', {          trigger: true        });      }    });    // 主视图,显示和编辑联系人    var MainView = Backbone.View.extend({      className: 'main stack',      initialize: function() {        this.editView = new EditView();        this.showView = new ShowView();      },      render: function() {        this.$el.append(this.showView.render().el);        this.$el.append(this.editView.render().el);        return this;      },      edit: function(item) {        this.showView.$el.removeClass('active');        this.editView.$el.addClass('active');        this.editView.change(item);      },      show: function(item) {        this.editView.$el.removeClass('active');        this.showView.$el.addClass('active');        this.showView.change(item);      }    });    // 整个页面的视图,管理SiderbarView和MainView两个子视图    var AppView = Backbone.View.extend({      className: 'contacts',      initialize: function() {        this.sidebar = new SidebarView({          model: this.model        });        this.main = new MainView();        this.vdiv = $('
').addClass('vdivide'); this.model.fetch(); this.render(); }, render: function() { this.$el.append(this.sidebar.render().el); this.$el.append(this.vdiv); this.$el.append(this.main.render().el); $('#article').append(this.el); return this; }, show: function(item) { this.sidebar.active(item); this.main.show(item); }, edit: function(item) { this.sidebar.active(item); this.main.edit(item); } }); // 路由 var AppRouter = Backbone.Router.extend({ routes: { '': 'show', 'contacts/:id': 'show', 'contacts/:id/edit': 'edit' }, show: function(id) { if (id != undefined) { appView.show(this.getContact(id)); } else { appView.show(contacts.first()); } }, edit: function(id) { appView.edit(this.getContact(id)); }, getContact: function(id) { return contacts.getByCid(id); } }); var contacts = new Contacts(); window.appView = new AppView({ model: contacts }); window.appRouter = new AppRouter(); Backbone.history.start(); });})(jQuery);

 

转载于:https://www.cnblogs.com/Fredric-2013/p/4466477.html

你可能感兴趣的文章
无法启动Outlook,无法打开Outlook窗口,无法打开文件夹的集合
查看>>
《TCP/IP详解卷1》学习小结(三)------ARP协议与RARP协议
查看>>
windows phone (20) Iamge元素
查看>>
golang 强制类型转换
查看>>
案例精解:BGP路由黑洞
查看>>
【Laravel 5.5】快速入门 —— 安装配置篇
查看>>
报告称三季度Android、iOS垄断智能机市场96%份额
查看>>
linux下iptables讲解
查看>>
java启动dos命令收集笔记一
查看>>
图片无法显示,载入制定url失败
查看>>
如何在MAP/REDUCE中不检查输出路径?
查看>>
Redis系列--6、Redis Java连接操作
查看>>
Python之encode与decode浅析
查看>>
记一次windows下oracle的整库移动
查看>>
MPLS TE 流量工程路径选择原理和配置模板 for CISCO
查看>>
mysql replication(主从复制)(二)MSS模式
查看>>
APP-V序列化服务器部署,应用程序虚拟化部署笔记四
查看>>
一段查看终端端口的asp代码
查看>>
关闭默认共享-注册表-批处理
查看>>
apache_1.3.41+mysql-4.0.26+php-4.4.8+Redhat5 linux
查看>>