Backbone实战教程(二)

在Backbone实战教程(一)中我们已经写好了基本页面文件、功能需求以及整体框架。今天我们就正式进入js代码的实现部分。

首先附上Backbone和Underscore官方文档地址,这里才是最佳的学习地方:

Backbone:http://backbonejs.org/

Underscore:http://underscorejs.org/

整个实例我已经做好,大家可以在这里看:

Backbone通讯录实例v1.0

  1. 定义项目的命名空间

     var Contact = {      Models: {},      Collections: {},      Views: {}  }; 
  2. Backbone模型(model)初探

    首先定义弹窗模型(主要是页面所用的弹窗部分,如添加,修改联系人等),因为页面很多地方都要用到弹窗,而所有这些弹窗都有很多共性,所以我们把弹窗定义为一个模型,方便管理。

     Contact.Models.Dialog = Backbone.Model.extend({      defaults:{          dialogId: "",          title: "",          html: "",          btnvalue: ""      }  }); 

    定义一个模型只需要继承Backbone的Model,这样我们的模型就有了一些方法与属性,如get,set,destory等方法,我们也可以重写这些方法,也可以定义一些自己的方法用来操作Model。

    defaults:定义模型的默认属性和这些属性的默认值,也可不定义

    Bacbkone并不是严格的MVC,所以即使我们这样定义了一个Dialog的模型,在后期使用的时候,我们可以在此模型中随便放对象进去,如:

     var tmpDialog = new Contact.Models.Dialog({      aaa : "ssss",      bb: "xxx"  }); 

    此时tmpDialog里面的属性是这样的,我们可以用model.attributes来查看model的所有属性:

     alert(JSON.stringify(tmpDialog.attributes)); 

    此时我们可以看到属性有:

     {      aaa : "ssss",      bb: "xxx",      dialogId: "",       title: "",       html: "",       btnvalue: ""          } 

    除了这几个属性之外,Backbone还会自动为每个model分配一个唯一id,可以通过model.id得到它的值。

    当我们new一个Backbone对象的时候,会自动调用constructor / initialize方法,我们可以重写此方法来实现一些效果。

    我们也可以继承自己的Model(或View或collection),如我们现在需要一个特殊的弹窗,除了以上的几个属性之外,它还有特殊的属性和方法,如:

     Contact.Models.SpecialDialog = Contact.Models.Dialog.extend({      defaults: {          sepcolum: "xxx"      },      sepMethod: function(){          //you codes      }  }); 

    此时我们的SpecialDialog既有了Dialog的所有属性和方法,又有了自己特殊的属性和方法。

    Backbone为我们提供的很多脚手架,关于Model的更多属性和方法请查看Backbone的官方文档。

    下面附上联系人模型的代码:

     Contact.Models.Member = Backbone.Model.extend({      defaults:{          name: "",          mobile: "",          email: "",          selected: false      },      //切换选中      toggle: function(){          this.set({              selected: !this.get("selected")          });      }  }); 
  3. Backbone模型(collection)初探

    collection,顾名思义集合的意思。Backbone中的collection就用来存放model的集合,或者说相当于数据库中的一张表,model里面定义了这张表的字段。上代码:

     Contact.Collections.Member = Backbone.Collection.extend({      model: Contact.Models.Member,      localStorage: new Backbone.LocalStorage("w3cboy-contact"),      // 获取已选model      selected : function() {          return this.filter(function(itm) {              return itm.get("selected");          });      },      // 根据关键词搜索      serachByKeyWord:function(keyword){          var pattern = new RegExp($.trim(keyword).toLocaleLowerCase());          return this.filter(function(itm){              var name = itm.get("name").toLocaleLowerCase(),                  mobile = itm.get("mobile");              return pattern.test(name)  pattern.test(mobile);          });      }  }); 

    model:定义了此collection对应的model

    toSJON方法将collection中的model对象json字符串输出

    向collection中添加model有两种方法:

    1. 创建的时候添加

       var member = new Contact.Collections.Member([{name: "",mobile:"",email:""}, model2, ...]);  
    2. 创建完成后添加
       //多个添加  member.add([model1, model2, ...]);  //单个添加  member.add({name: "",mobile:"",email:""}); 

      我们添加的时候传入的都是一个个对象而并不是一个个Model,大家不用担心,collection会自动转成对应的model。

      filter方法是underscore的方法,此方法传入一个list,和断言(谓词)通俗的说就是判断过滤条件,返回符合条件的属性

      除此之外还有set,get,remove等和underscore提供的一些方法,对应用法大家仔细看backbone官方文档和underscore官方文档。

  4. Backbone模型(view)初探

    按照前面的比喻,View就是数据库里面的一条记录的样式了(切记是一条记录,很多新手在这里容易搞错)。

    老规矩,先上代码:

     Contact.Views.Member = Backbone.View.extend({      tagName: "tr",      template: _.template($("#tmp-memberlist").html()),      events:{          "click input": "toggleSelect",          "click .contact-edit":"editMember",          "click .contact-del":"deleteMember"      },      initialize:function(opts){          this.mainView = opts.mainView;          this.listenTo(this.model,"change",this.render);          this.listenTo(this.model, "destroy", this.remove);      },      render:function(){          this.$el.html(this.template(this.model.toJSON()));          return this;      },      //切换选中样式      toggleSelect:function(){          this.model.toggle();          this.mainView.chooseStatus();      },      //编辑联系人      editMember:function(){          var _this = this;          var item = {              dialogId: "editDialog",              title: "修改联系人",              html: _.template($("#tmp-member").html(), this.model.toJSON()),              btnvalue: "修改"          };          _this.mainView.dialog.model = new Contact.Models.Dialog(item);          _this.mainView.dialog.render();          $("#subBtn").unbind();          $("#subBtn").bind("click",function(){              var $name = $("#inputName"),                     $mobile = $("#inputMobile");               var name = $.trim($name.val()),                  mobile = $.trim($mobile.val()),                  email = $.trim($("#inputEmail").val());               if(!name){                  $name.focus();                  return false;              }              if(!mobile){                  $mobile.focus();                  return false;              }              _this.model.set({                  name: name,                  mobile: mobile,                  email: email              });              $("#editDialog").modal("hide");          });      },      //移除联系人      deleteMember:function(){          this.model.destroy();          // 联系人个数          this.mainView.totalMembers();          this.mainView.chooseStatus();      }  }); 

    相比前面的,View里面的代码就相对复杂一些了。

    el:定义用什么DOM节点元素来包裹一个model,默认使用div包裹,是通过tagName,className,id,属性特性这些创建的,如:

     tagName: "li",  id: "list",  className: "list" 

    那么生成的dom节点将是这样的:

     <li id="list" class="list">...</li> 

    也可以直接定义el:

     el: "li" 

    此时el里面只能填html标签名,如果下面还定义tagName,id,className这些将不会生效。

    events:即事件,贯穿整个model collection view以及router,只是在前面的model collection中没有用到,所以放在这里一起讲。如果你引入了其它的库,也可以用其它库提供的事件方法。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索backbone
, 方法
, function
, this
, js json el
, 属性
, model
, w mobile 用Json
, 弹出自定义view
模型Model
backbone.js实战 pdf、backbone.js实战、backbone.js实战源码、backbone实战 pdf、backbone实战,以便于您获取更多的相关知识。

时间: 2024-10-28 12:19:20

Backbone实战教程(二)的相关文章

Backbone实战教程(一)

Backbone是一个前端 JS 代码 MVC 框架,但它并不是严格意义上的Model, View, Controller(这一点我将在实例中解答).它不可取代 Jquery,不可取代现有的 template 库.而是和这些结合起来构建复杂的 web 前端交互应用. Backbone: 强制依赖于Underscore.js,所以引入backbone.js之前必须先引入Underscore.js.Underscore.js 是一个实用型工具库: 非强制依赖于 jQuery/Zepto: 根据模型的

mybatis实战教程(mybatis in action),mybatis入门到精通

 目录(?)[-] mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis in action之四实现关联数据的查询 mybatis实战教程mybatis in action之五与spring3集成附源码 mybatis实战教程mybatis in action之六与Spring

mybatis实战教程

http://www.yihaomen.com/article/java/302.htm 作者:轻舞肥羊 日期:2012-11-12 写在这个系列前面的话:          以前曾经用过ibatis,这是mybatis的前身,当时在做项目时,感觉很不错,比hibernate灵活.性能也比hibernate好.而且也比较轻量级,因为当时在项目中,没来的及做很很多笔记.后来项目结束了,我也没写总结文档.已经过去好久了.但最近突然又对这个ORM 工具感兴趣.因为接下来自己的项目中很有可能采用这个OR

ActiveReports 9实战教程(3): 图文并茂的报表形式

原文:ActiveReports 9实战教程(3): 图文并茂的报表形式  基于上面2节内容,我们搭建了AR9的开发环境,配置好了数据源.在本节,我们以官方提供的3个中文图文并茂的报表来展示AR9的功能,并通过实战的方式一一分享. 以往做报表相关的工作时,最害怕的是报表的UI设计工作,当遇到一个布局非常复杂的报表,往往会花上两.三时间才能完成报表的UI设计工作.造成这一问题的原因除了报表本身比较复杂之外,其中一个主要原因就是报表设计器没有提供足够多的功能来辅助报表的UI设计工作.      

HDInsight-Hadoop实战(二)传感器数据分析

HDInsight-Hadoop实战(二)传感器数据分析 简介 现在很多个人和商业设备含有从物理世界中收集信息的传感器.例如,大多数电话拥有 GPS,健身设备可跟踪你走的步数,恒温控制器可监控建筑的温度. 在此教程中,你将了解如何将 HDInsight 用于处理暖气.通风和空气调节 (HVAC) 系统产生的历史数据,以识别不能有效维持设定温度的系统.你将了解如何: 优化和丰富来自多个国家/地区的建筑的温度数据 分析数据以确定哪些建筑在保持适宜温度方面存在问题(实际记录的温度对比恒温控制器设定的温

MVC5 + EF6 入门完整教程二

原文:MVC5 + EF6 入门完整教程二 从前端的UI开始 MVC分离的比较好,开发顺序没有特别要求,先开发哪一部分都可以,这次我们主要讲解前端UI的部分. ASP.NET MVC抛弃了WebForm的一些特有的习惯,例如服务器端控件,ViewState这些东西,让Web回归原始的状态,Web是什么样子就是什么样子.而谈到一个Web Application的UI,涉及到的无非就是html.css. js这些东西. 文章提纲 概述 重要概念介绍 建立 注册/登录UI 步骤(静态页面àViewà功

Mybatis实战教程之入门到精通(经典)_java

什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个共同点: 1. 从配置文件(通常是XML配置文件中)得到 ses

jQuery EasyUi实战教程之布局篇_jquery

jQuery EasyUI Layout是一种基于jQuery的布局框架,今天初次使用Jquery EasyUi,简单的做了个布局页面感觉还不错,给大家分享一下,就是不知道Jquery EasyUi浏览器兼容性怎么样. 最后效果图如下: 使用Jquery EasyUi开发之前首先要引用Jquery EasyUi的Js和Css文件,引用如下: <script src="../jquery.min.js" type="text/javascript"><

ActiveReports 9实战教程(2): 准备数据源(设计时、运行时)

原文:ActiveReports 9实战教程(2): 准备数据源(设计时.运行时) 在上讲中<ActiveReports 9实战教程(1): 手把手搭建环境Visual Studio 2013 社区版>,我们已经结合Visual Studio 2013搭建好了ActiveReports 9的开发环境,并完成了一个Hello World的RDL报表. 在本文,我们通过配置数据源进行报表实战,做过报表开发的报表达人知道,报表中的数据源分设计时数据源和运行时数据源. 如何理解呢? 这2类数据源,表结