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://dmyz.org/archives/598。原文章虽然是入门范例,但大牛的入门对我这种菜逼来说还是看不懂,所以我在其原来的例子上进行了一些取舍并对一些代码进行了注释。

Backbone.js 中文文档:http://www.css88.com/doc/backbone/

HTML代码,只要把backbone的代码放入其内运行即可:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <script type="text/javascript" src="https://code.jquery.com/jquery-1.11.1.js"></script>
 5 <script type="text/javascript" src="http://underscorejs.org/underscore-min.js"></script>
 6 <script type="text/javascript" src="http://backbonejs.org/backbone-min.js"></script>
 7
 8 <link href="http://cdn.bootcss.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">
 9 </head>
10 <body>
11   <table id="js-id-gists" class="table">
12     <thead><th>description</th><th>URL</th><th>created_at</th></thead>
13     <tbody></tbody>
14   </table>
15
16   <script>
17     //backbone....
18   </script>
19 </body>
20 </html>

首先是M:

//创建一个自定义模型类
var Gist = Backbone.Model.extend({
  url: ‘https://api.github.com/gists/public‘,

  //backbone提供了一个parse方法,它会在 fetch及 save 时执行。
  //传入本函数的为原始 response 对象,这个方法提供传入两个参数,并返回第一个参数。
  parse:function(response){
      return (response[0])
  },

  //默认属性值设置,如果属性中没有website(注意不是website值为空),会设置website值为dmyz。
  defaults:{
    website:‘dmyz‘
  },

  //验证事件,当website值为dmyz时触发
  validate:function(attrs){
    if(attrs.website == ‘dmyz‘){
      return ‘website error‘
    }
  }
})

gist = new Gist(); //实例化模块

gist.on("validate",function(model,error){
  alert(error)
})

//get    collection.get(id) 通过一个id,一个cid,或者传递一个model来获得集合中的模型。

gist.on(‘change‘,function(model){   //绑定一个change事件
  var tbody = document.getElementById(‘js-id-gists‘).children[1],
      tr = document.getElementById(model.get(‘id‘));  

  if(!tr){
    tr = document.createElement(‘tr‘);
    tr.setAttribute(‘id‘,model.get(‘id‘));
  }

  tr.innerHTML="<td>"+model.get(‘description‘)+"</td><td>"+model.get(‘url‘)+"</td><td>"+model.get(‘created_at‘) + ‘</td>‘;
  tbody.appendChild(tr);
})

//从远程获取数据,获到数据后会触发change事件
// gist.fetch();

// 将数据存储到数据库
gist.save()

  

整个过程:

  1. 创建自定义模型类,并实例化
  2. gist.fetch()从远程拉取数据,触发了change事件
  3. 绑定在gist上的change事件执行(model是其数据模型),通过model.get()来获取数据,渲染到页面
  4. 在本例中,可以看出model是数据模型,起到操作数据的作用。

M+V:

 1 var Gist = Backbone.Model.extend({
 2   url: ‘https://api.github.com/gists/public‘,
 3   parse:function(response){
 4       return (response[0])
 5   }
 6 })
 7
 8 //实例化模块
 9 gist = new Gist();
10
11 //创建一个自定义视图类
12 var GistRow = Backbone.View.extend({
13   //所有的视图都拥有一个 DOM 元素(el 属性),即使该元素仍未插入页面中去。 视图可以在任何时候渲染,然后一次性插入 DOM 中去,这样能尽量减少 reflows 和 repaints 从而获得高性能的 UI 渲染。
14
15   el:‘tbody‘,
16
17   //指定视图的数据模型
18   Model:gist,
19
20   //initialize为初始化函数,创建视图时,它会立刻被调用。
21   //initialize函数在this上监听Model的change事件,发生改变时时触发render事件
22   initialize:function(){
23     this.listenTo(this.Model,‘change‘,this.render);
24   },
25
26   //渲染视图
27   render:function(){
28     var model =this.Model,
29         tr = document.createElement(‘tr‘);
30     tr.innerHTML=‘<td>‘ + model.get(‘description‘) + ‘</td><td>‘ + model.get(‘url‘) + ‘</td><td>‘ + model.get(‘created_at‘) + "</td>";
31     this.el.innerHTML = tr.outerHTML;
32     // console.log(this.el)
33     return this;
34   }
35 });
36
37 //实例化GistRow,立即执行initialize函数
38 var tr = new GistRow();
39 gist.fetch();

整个过程:

  1. 创建自定义模型类,并实例化
  2. 创建自定义视图类,并实例化,指定模型
  3. 立即执行initialize函数,监听model的change事件,
  4. fetch()事件获取远程数据,触发change事件,执行render事件

M+V+C:

 1 var Gist = Backbone.Model.extend();
 2
 3 //创建一个自定义集合类(collection)
 4 var Gists = Backbone.Collection.extend({
 5   //指定集合(collection)中包含的模型类
 6   model:Gist,
 7   url:‘https://api.github.com/gists/public‘,
 8   parse:function(response){
 9       return response;
10   }
11 })
12
13 gists = new Gists();
14
15 //创建一个视图类,其作用是渲染每一行的视图
16 var GistRow = Backbone.View.extend({
17   //tagName, className, 或 id 为视图指定根元素
18   tagName:‘tr‘,
19   render:function(model){
20     this.el.id = model.cid;
21     this.el.innerHTML =  ‘<td>‘ + model.get(‘description‘) + ‘</td><td>‘+ model.get(‘url‘) + ‘</td><td>‘ + model.get(‘created_at‘)+"</td>"
22     return this;
23   }
24 })
25
26 var GistView = Backbone.View.extend({
27   el:‘tbody‘,
28   // 指定集合类
29   collection:gists,
30
31   //初始化函数,实例化时立即执行
32   initialize:function(){
33     this.listenTo(this.collection,‘reset‘,this.render);
34   },
35
36   //渲染视图
37   render:function(){
38     var html = ‘‘;
39     //collection.models 访问集合中模型的内置的JavaScript 数组
40     //遍历所有models,设置他们的html
41     _.forEach(this.collection.models,function(model){
42       var tr = new GistRow();
43       html += tr.render(model).el.outerHTML;
44     })
45     this.el.innerHTML = html;
46     return this;
47   }
48 });
49
50 //实例化GistRow,调用initialize函数
51 var gistsView = new GistView();
52 gists.fetch({reset:true});

整个过程:

  1. 创建一个自定义模型类和集合类,实例化集合类
  2. 创建俩个自定义视图类,一个渲染每行的数据,一个渲染整个页面
  3. 实例化视图类GistView,在集合类上绑定监听事件
  4. fetch()触发监听事件,执行render函数,遍历所有models
  5. 在render函数中实例化视图类GistRow,,渲染每行
时间: 2024-10-25 21:53:57

Backbone学习笔记一Backbone中的MVC的相关文章

【iOS学习笔记】iOS中的MVC设计模式

模型-视图-控制器(Model-View-Controller,MVC)是Xerox PARC在20世纪80年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已广泛应用于用户交互应用程序中.在iOS开发中MVC的机制被使用的淋漓尽致,充分理解iOS的MVC模式,有助于我们程序的组织合理性. 模型对象模型对象封装了应用程序的数据,并定义操控和处理该数据的逻辑和运算.例如,模型对象可能是表示游戏中的角色或地址簿中的联系人.用户在视图层中所进行的创建或修改数据的操作,通过控制器对象传达

Backbone学习笔记

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

[ExtJS学习笔记]第九节 Extjs5的mvc与mvvm框架结构简介

本文地址:http://blog.csdn.net/sushengmiyan/article/details/38537431 本文作者:sushengmiyan -------------------------------------------------------------资源链接----------------------------------------------------------------------- 翻译来源:http://docs.sencha.com/ext

MVC4 学习笔记 之 URL中存在编译的空格 20%20%

/Config/Edit/QQCC%20%20%20%20%20%20%20 原因是: 通过EF直接添加了空格? NO 是因为你的数据库字段设计问题,因为你当然设计如>:sID nchar(10) 那你一定想输入10个字符,但实际你只输入了必个,所以后面数据自动帮你补空了. 从EF数据库取出数据,在绑定的时候为安全,编码了,所以显示%20,代表一个空格. MVC4 学习笔记 之 URL中存在编译的空格 20%20%,布布扣,bubuko.com

Guava学习笔记:guava中的Preconditions使用

Guava学习笔记:guava中的Preconditions使用 转载:http://outofmemory.cn/java/guava/base/Preconditions google guava的base包中提供的Preconditions类用来方便的做参数的校验,他主要提供如下方法: checkArgument 接受一个boolean类型的参数和一个可选的errorMsg参数,这个方法用来判断参数是否符合某种条件,符合什么条件google guava不关心,在不符合条件时会抛出Illeg

【学习笔记】jQuery中的动画与效果

1.基本效果 匹配元素从左上角开始变浓变大或缩小到左上角变淡变小 ①隐藏元素 除了可以设置匹配元素的display:none外,可以用以下函数 hide(speed,[callback])  返回值:jQuery  参数-speed:三种预订速度之一的字符串String(slow,normal,fast)或表示动画时长的毫秒数Number  callback:在完成动画时执行的函数,每个匹配元素执行一次 slow=600毫秒  normal=400毫秒  fast=200毫秒 以优雅的动画隐藏所

Guava学习笔记:guava中对字符串的操作

Guava学习笔记:guava中对字符串的操作 转载:http://outofmemory.cn/java/guava/base/Strings 在google guava中为字符串操作提供了很大的便利,有老牌的判断字符串是否为空字符串或者为null,用指定字符填充字符串,以及拆分合并字符串,字符串匹配的判断等等. 下面我们逐一了解这些操作: 1. 使用com.google.common.base.Strings类的isNullOrEmpty(input)方法判断字符串是否为空        

Linux学习笔记——vmware plarer中安装ubuntu

1.前言 学习了很长时间ubuntu,在旧笔记中安装过lubuntu,也使用过他人安装好的ubuntu虚拟机(contiki2.6和contiki2.7).熟悉了ubuntu之后,决定自己尝试通过vmware player安装ubuntu. [1]vmware plaryer是免费软件,不存在破解问题.如果用来学习ubuntu完全足够了. [2]建议在虚拟机种学习ubuntu,等完全熟练之后再摆脱windows.ubuntu现在还没有有道笔记,QQ等工具,总感觉网上世界少了点什么. [3]在虚拟

cocos2dx学习笔记(4)——VS2010中的中文乱码问题

当你想使用中文时,你是否有这样的一个困惑. 把样例中的HelloWorld改成中文的 "你好,世界!". 然后编译运行,发现居然是个乱码!!! 因为cocos2dx中使用的是UTF-8字符集,而VS中确实ANSI. 所以我们需要对其进行字符集转换. 然后纵里寻它求百度,终于找到了解决方案. 一个函数搞定! #include "cocos2d.h" char* toUTF(const char* strGB2312) { int iLen = MultiByteToW