Backbone入门

(一)Backbone简介

Backbone是一个轻量级的JavaScript MVC框架,压缩后只有23kb,不过它依赖于Underscore.js和jQuery这两个JS库。Backbone是由Jeremy Ashkenas创建的,Underscore.js也是他创建的,他还创建了CoffeeScript这门优雅的JS转译语言。

模型(Model)是Backbone中的一个关键组件,Model用来存储应用的所有数据,以及直接和数据操作相关的逻辑,包括数据存储,数据验证,以及数据发生变动时触发相关动作。无论何时一个UI动作导致了模型属性的变化,模型都会触发change事件,这时用来展示模型状态的视图(View)会收到反馈,并做出相应的响应,重绘UI。你不用写那些胶水代码去更新你的DOM,比如通过元素id去找到某个元素,然后对其进行操作。只要模型改变了,视图就会更新。

视图(View)是用来把模型中的数据显示到页面上的,同时也可以监听DOM上的事件然后做出响应。

集合(Collection)是model对象的一个有序的集合。

(二)模型(Model)

使用Backbone之前要引入以下三个JS文件:

<script src="https://code.jquery.com/jquery-2.2.0.min.js"></script>

<script src="http://underscorejs.org/underscore-min.js"></script>

<script src="http://backbonejs.org/backbone-min.js"></script>

1.创建一个model

var Person = Backbone.Model.extend({

initialize: function(){

alert(‘Hello world!‘);

}

});

var person = new Person;

创建了一个Model对象Person,并在初始化的时候输出“Hello world!”,接着定义了一个Person对象的实例person,执行以上代码会在页面弹出“Hello world!”的框。

2.设置model属性

var Person = Backbone.Model.extend({

initialize: function(){//实例化时会执行这里的代码

alert(‘Hello world!‘);

}

});

//在实例化model时设置

var person = new Person({

name: ‘Jack‘,

age: 20

});

//也可以在model实例化后,通过set方法进行设置

var person = new Person;

person.set({

name: ‘Elizabeth‘,

age: 18

});

person.set(‘age‘, 22);//设置单个属性

这里提供了设置model指的三种方式:实例化时设置、通过set方法设置多个属性、通过set方法设置单个属性。

3.获取model属性

var Person = Backbone.Model.extend({

initialize: function(){

console.log(‘Hello world!‘);

},

aboutMe: function(){

return ‘I\‘m ‘ + this.get(‘name‘) + ‘, i live in ‘ + this.get(‘address‘),street;

}

});

var person = new Person({

name: ‘Asan‘,

address: {

street: ‘Mongo Street‘

}

});

console.log(person.aboutMe());

console.log(person.get(‘name‘));

在model中定义了一个aboutMe方法,在里面通过this.get方法可以获取到model属性的值,并返回。Person的实例可以调用aboutMe方法,输出model属性的值。

4.设置model默认属性

var Person = Backbone.Model.extend({

defaults: { //设置默认属性

name: ‘Kagol Antony‘,

address: {

street: ‘1st Street‘,

city: ‘Shenzhen‘,

State: ‘TX‘,

zipCode: 78701

}

},

initialize: function(){//初始化,首先执行

console.log(‘hello world!‘)

},

aboutMe: function(){

return ‘I\‘m ‘ + this.get(‘name‘) + ‘, i live in ‘ + this.get(‘address‘).street;

}

});

var person = new Person({

name: ‘Asan‘

});

console.log(person.get(‘name‘));//Asan

console.log(person.get(‘address‘).city);//Shenzhen

可以通过设置model的defaults属性为model设置默认属性。

5.使用model属性

var Person = Backbone.Model.extend({

defaults: {

name: ‘Kagol Antony‘,

hobby: ‘basketball‘

},

initialize: function(){

console.log(‘hello world!‘)

},

like: function(hobbyName){

this.set({

hobby: hobbyName

});

}

});

var person = new Person;

person.like(‘coding‘);

console.log(person.get(‘hobby‘));

在model中定义了一个like方法,接受一个参数,为爱好的名称(hobbyName),用于设置hobby属性。

6.监听model属性的变化

var Person = Backbone.Model.extend({

defaults: {

name: ‘Elizabeth‘,

age: 18

},

initialize: function(){

console.log(‘hello world‘);

this.on(‘change:name‘, function(model){

var name = model.get(‘name‘);

console.log(‘Changed my name for ‘ + name);

})

}

});

var person = new Person ({

name: ‘Jack‘,

age: 20

}); //实例化的时候改变name属性不会触发change事件

person.set({name: ‘Kagol‘});//触发change事件,输出:‘Changed my name for Kagol‘

console.log(person.hasChanged());//true

console.log(person.changedAttributes());// Object {name: "Kagol"}

在初始化时通过this.on方法绑定change事件,可以监听model中某个属性的变化,例子中是监听name属性,只要name属性一改变就在控制台输出改变后的name。

7.数据验证

var Person = Backbone.Model.extend({

validate: function(attributes){

if(attributes.age < 0){

return ‘You can\‘t be negative years old‘;

}

},

initialize: function(){

console.log(‘hello, world!‘);

this.on(‘invalid‘, function(model, error){

console.log(error);

})

}

});

var person = new Person;

person.set({name: ‘Mary Poppins‘, age: -21}, {validate: true});// 会验证,输出"You can‘t be negative years old"

person.set({name: ‘Mary Poppins‘, age: 20}, {validate: true});//不会验证

person.set({name: ‘Mary Poppins‘, age: -21}, {validate: false});//不会验证

person.set({name: ‘Mary Poppins‘, age: -21});//不会验证

在model的validate方法中可以定义验证的逻辑,它接受一个参数attributes,代表model的属性,这里是验证了model的age属性,当其小雨0时,返回一段提示文字。在初始化时要通过this.on绑定invalid方法。在通过set方法设置model属性的时候,必须带上第二个参数{validate: true},才会验证。

(三)视图(View)

1.加载模板

<script type="text/template" id="search_template">

<label>My Search: </label>

<input type="text" id="search_input">

<input type="button" id="search_button" value="Search">

</script>

<div id="search_contailer"></div>

var SearchView = Backbone.View.extend({

initialize: function(){

this.render();

},

render: function(){

var template = _.template($(‘#search_template‘).html(), {});

this.$el.html(template);

}

});

var search_view = new SearchView({

el: $(‘#search_contailer‘)

});

这里需要用到Underscore.js的模板库_.template,模板可以写在View的外面,通过type为"text/template"的script标签包裹,还要定义一个容器(这里是一个div)用于容纳模板的内容。

定义一个视图(View)和定义一个model非常类似,它也有一个initialize方法,用于初始化,render方法(在初始化时被调用)用于渲染模板。

2.添加监听事件

var SearchView = Backbone.View.extend({

initialize: function(){

this.render();

},

render: function(){

var template = _.template($(‘#search_template‘).html(), {});

this.$el.html(template);

},

events: {//添加事件

‘click #search_button‘: ‘doSearch‘

},

doSearch: function(){

console.log(‘Search for ‘ + $(‘#search_input‘).val());

}

});

var search_view = new SearchView({

el: $(‘#search_contailer‘)

});

添加监听事件只要在view的events属性中配置就可以了,可以配置多个事件。

3.向模板中传递参数

<script type="text/template" id="search_template">

<label><%= search_label %></label>

<input type="text" id="search_input">

<input type="button" id="search_button" value="Search">

</script>

<div id="search_contailer"></div>

var SearchView = Backbone.View.extend({

el: $(‘#search_contailer‘),//可以将el直接写在这里

initialize: function(){

this.render();

},

render: function(){

var variables = {//使用模版变量

search_label: ‘Kagol Search: ‘ // 可以传递多个参数

};

var template = _.template($(‘#search_template‘).html());

this.$el.html(template(variables));

},

events: {//添加事件

‘click #search_button‘: ‘doSearch‘

},

doSearch: function(){

console.log(‘Search for ‘ + $(‘#search_input‘).val());

}

});

var search_view = new SearchView;

要在模板中传递参数,只需要在把一个对象传递给_.template()()即可。

(四)集合(Collection)

<script type="text/template" id="artist_template">

<% _.each(artists, function(artist){ %>

<tr>

<td><%= artist.get(‘name‘) %></td>

<td><%= artist.get(‘hometown‘) %></td>

</tr>

<% }); %>

</script>

<table id="table"></table>

var Artist = Backbone.Model.extend({

defaults: {

name: ‘Jack‘,

hometown: ‘American‘

},

initialize: function(){}

});

var Artists = Backbone.Collection.extend({

model: Artist

});

var artist1 = new Artist;

var artist2 = new Artist({

name: ‘Kagol‘,

hometown: ‘China‘

});

var artist3 = new Artist({

name: ‘Elizabeth‘,

hometown: ‘England‘

});

var artists = new Artists([artist1, artist2, artist3]);

var ArtistView = Backbone.View.extend({

el: $(‘#table‘),

template: _.template($(‘#artist_template‘).html()),

initialize: function(){

this.render();

},

render: function(){

this.$el.html(this.template({

artists: artists.models

}));

}

});

var artistView = new ArtistView;

这个例子中,先创建了一个model,叫Artist,然后定义了一个Artist的Collection,名为Artists。接着定义了三个Artist的实例和一个Artists的实例,并用那三个Artist的实例初始化artists。接着定义了一个View,在render方法中定义了一个参数叫artists,它是一个数组,也就是那个Artist的实例。

值得注意的是模板中使用了Underscore.js的_.each,用于循环遍历,第一个参数就是参数artists,第二个参数是回调函数。

(五)总结

Backbone最适合的应用场景是单页面应用(SPA),并且页面上有大量数据模型,模型之间需要进行复杂的信息沟通。Backbone在这种场景下,能很好地实现模块间松耦合和事件驱动。Backbone不像Angular一样帮你做好了很多事,你只能在它限定的规则下写代码,而是可定制性很高,使用Backbone提供的工具,你可以做任何你想做的事。

时间: 2024-10-15 23:00:10

Backbone入门的相关文章

backbone入门系列(4)集合

collection就是一堆model的集合,这个集合就是个舞台,可以放一个人说单口相声,也可以对口,也可以群口,,, 在前文,也就是入门系列3的基础上,添加js代码 var noteCollection=Backbone.Collection.extend({ model:Note //指定相关模型});var note1=new Note({id:1,title:"西红柿"});//设置id,表明唯一性 var note2=new Note({id:2,title:"酱油

Backbone入门讲解

Backbone是一个实现了web前端mvc模式的js框架. 一种解决问题的通用方法,我们叫做模式. 设计模式:工厂模式,适配器模式,观察者模式等,推荐js设计模式这本书.设计模式是一种思想. 框架模式:MVC,MVP,MVVM等.框架模式是开发项目的一种方案. MVC指的是什么?M:model(模型),V:view(视图),C:controller(控制器) MVC模式的思想,把模型和视图分离,通过控制器来连接它们. 这些模块是怎么实现mvc的呢? Events模块是事件模块,其他模块都继承了

backbone入门系列(1)基本组成部分

一,首先backbone有以下组成部分:Events:事件驱动模块 Model:数据模型 Collection:模型集合器 Router:路由器(对应hash值) History:开启历史管理 Sync:同步服务器方式 View:视图(含事件行为和渲染页面 相关方法) 各个部分会在后面逐一说明. 二,因为backbone基于Underscore.js,他们的dom处理又依赖于jquery,所以在进行操作时至少要按次序引入三个js文件 <!DOCTYPE html><html lang=&

Backbone入门——开发第一个Backbone页面

1. 功能描述在新建的html页面中,通过导入的backbone文件搭建一个简单的mvc结构.当用户进入该页时,id号为"divTip"的<div>元素中将显示"hello,backbone!"字样. 2. 实现代码 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String pa

backbone入门学习一

初识backbone 1.Backbone是什么? Backbone是一个非常轻量级的javaScript库,可以打造为模型(Model)-视图(View)-控制器(Controller)即MVC类结构的应用程序. 2.Backbone能干什么? 通过这种结构能够有组织的分门别类的管理Web应用程序中纷乱复杂的JavaScript代码,以及处理单页界面(SPI)中含有大量复杂的AJAX交互请求. 3.Backbone的MVC架构 数据模型(Model)负责数据原型的创建和各类事件的自定义,并通过

Backbone

什么是MVC模式 模式:一种解决问题的方法 设计模式  :工厂模式.适配器模式.观察者模式等 框架模式  :MVC.MVP.MVVM等(框架模式里有很多设计模式) MVC: M-Model V-View C-Controller(连接M和V) 2. MVC模式的思想 把M和V分开 服务器端MVC模式非常容易实现 3.   Web前端MVC模式 Web页面本身就是一个大的View,不容易做到分享操作 backbone适合复杂的大型开发 4.  backbone的模块 Events事件驱动方法 Mo

麦子学院-Web前端开发工程师系列培训教程

HTML+CSS基础入门1.课程介绍2.html的语法3.html的基本结构4.html的文档设置标记上(格式标记)5.html的文档设置标记下(文本标记)6.html图像标记img7.html超链接的使用8.html表格相关的标记9.html表格实战<简单的网页布局>10.html框架详解与框架布局实战11.HTML表单设计(上)12.HTML表单设计(下)13.使用CSS样式的方式14.定义CSS样式(CSS选择器)15.CSS常用属性(颜色属性)16.css常用属性(字体相关属性)17.

backbonejs学习笔记

Backbone是一个轻量级的前端MVC框架,用于结构化管理页面中的大量JS,建立与服务器.视图间的无缝连接,为构建复杂的应用提供基础框架.最适合的应用场景是单页面应用,并且页面上有大量数据模型,模型之间需要进行复杂的信息沟通.backbone所依赖的underscore类库提供了60多个函数用于处理数组操作.函数绑定以及javascript模板机制. 在Backbone中,DOM选择器.DOM事件和AJAX,都使用了jQuery的方法.如果不想使用jQuery或Zepto,而是使用其它的.或自

开发技术文档汇总

开发技术文档汇总:(持续更新) 1 Underscore 中文文档    github地址   英文文档 2 Express中文文档   github地址 3 Backbone中文文档 Backbone英文文档   github地址 4 Jquery中文文档(适合1.0--2,0) 5 Bootstrap中文 6 Less中文 7 NodeJs中文API 8 node.js相关的中文文档及教程 9 ECMAScript262中文兼容库 10 浏览器hacks 11 Rapheal中文   相关文