随着JavaScript程序变得越来越复杂,往往需要一个团队协作开发,这时代码的模块化和组织规范就变得异常重要了。MVC模式就是代码组织的经典模式。AepHTML5中文学习网 - HTML5先行者学习网
(……MVC介绍。)AepHTML5中文学习网 - HTML5先行者学习网
(1)ModelAepHTML5中文学习网 - HTML5先行者学习网
Model表示数据层,也就是程序需要的数据源,通常使用JSON格式表示。AepHTML5中文学习网 - HTML5先行者学习网
(2)ViewAepHTML5中文学习网 - HTML5先行者学习网
View表示表现层,也就是用户界面,对于网页来说,就是用户看到的网页HTML代码。AepHTML5中文学习网 - HTML5先行者学习网
(3)ControllerAepHTML5中文学习网 - HTML5先行者学习网
Controller表示控制层,用来对原始数据(Model)进行加工,传送到View。AepHTML5中文学习网 - HTML5先行者学习网
由于网页编程不同于客户端编程,在MVC的基础上,JavaScript社区产生了各种变体框架MVP(Model-View-Presenter)、MVVM(Model-View-ViewModel)等等,有人就把所有这一类框架的各种模式统称为MV*。AepHTML5中文学习网 - HTML5先行者学习网
框架的优点在于合理组织代码、便于团队合作和未来的维护,缺点在于有一定的学习成本,且限制你只能采取它的写法。AepHTML5中文学习网 - HTML5先行者学习网
Backbone的加载AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
<script src="/javascripts/lib/jquery.js"></script>AepHTML5中文学习网 - HTML5先行者学习网
<script src="/javascripts/lib/underscore.js"></script>AepHTML5中文学习网 - HTML5先行者学习网
<script src="/javascripts/lib/backbone.js"></script>AepHTML5中文学习网 - HTML5先行者学习网
<script src="/javascripts/jst.js"></script>AepHTML5中文学习网 - HTML5先行者学习网
<script src="/javascripts/router.js"></script>AepHTML5中文学习网 - HTML5先行者学习网
<script src="/javascripts/init.js"></script>AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网Backbone.ViewAepHTML5中文学习网 - HTML5先行者学习网
基本用法AepHTML5中文学习网 - HTML5先行者学习网
Backbone.View方法用于定义视图类。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var AppView = Backbone.View.extend({AepHTML5中文学习网 - HTML5先行者学习网
render: function(){AepHTML5中文学习网 - HTML5先行者学习网
$('main').append('<h1>一级标题</h1>');AepHTML5中文学习网 - HTML5先行者学习网
}AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网上面代码通过Backbone.View的extend方法,定义了一个视图类AppView。该类内部有一个render方法,用于将视图放置在网页上。AepHTML5中文学习网 - HTML5先行者学习网
使用的时候,需要先新建视图类的实例,然后通过实例,调用render方法,从而让视图在网页上显示。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var appView = new AppView();AepHTML5中文学习网 - HTML5先行者学习网
appView.render();AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网上面代码新建视图类AppView的实例appView,然后调用appView.render,网页上就会显示指定的内容。
AepHTML5中文学习网 - HTML5先行者学习网新建视图实例时,通常需要指定Model。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var document = new Document({AepHTML5中文学习网 - HTML5先行者学习网
model: docAepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网initialize方法AepHTML5中文学习网 - HTML5先行者学习网
视图还可以定义initialize方法,生成实例的时候,会自动调用该方法对实例初始化。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var AppView = Backbone.View.extend({AepHTML5中文学习网 - HTML5先行者学习网
initialize: function(){AepHTML5中文学习网 - HTML5先行者学习网
this.render();AepHTML5中文学习网 - HTML5先行者学习网
},AepHTML5中文学习网 - HTML5先行者学习网
render: function(){AepHTML5中文学习网 - HTML5先行者学习网
$('main').append('<h1>一级标题</h1>');AepHTML5中文学习网 - HTML5先行者学习网
}AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
var appView = new AppView();AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网上面代码定义了initialize方法之后,就省去了生成实例后,手动调用appView.render()的步骤。AepHTML5中文学习网 - HTML5先行者学习网
el属性,$el属性AepHTML5中文学习网 - HTML5先行者学习网
除了直接在render方法中,指定“视图”所绑定的网页元素,还可以用视图的el属性指定网页元素。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var AppView = Backbone.View.extend({AepHTML5中文学习网 - HTML5先行者学习网
el: $('main'),AepHTML5中文学习网 - HTML5先行者学习网
render: function(){AepHTML5中文学习网 - HTML5先行者学习网
this.$el.append('<h1>一级标题</h1>');AepHTML5中文学习网 - HTML5先行者学习网
}AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网上面的代码与render方法直接绑定网页元素,效果完全一样。上面代码中,除了el属性,还是$el属性,前者代表指定的DOM元素,后者则表示该DOM元素对应的jQuery对象。
AepHTML5中文学习网 - HTML5先行者学习网tagName属性,className属性AepHTML5中文学习网 - HTML5先行者学习网
如果不指定el属性,也可以通过tagName属性和className属性指定。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var Document = Backbone.View.extend({AepHTML5中文学习网 - HTML5先行者学习网
tagName: "li",AepHTML5中文学习网 - HTML5先行者学习网
className: "document",AepHTML5中文学习网 - HTML5先行者学习网
render: function() {AepHTML5中文学习网 - HTML5先行者学习网
// ...AepHTML5中文学习网 - HTML5先行者学习网
}AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网template方法AepHTML5中文学习网 - HTML5先行者学习网
视图的template属性用来指定网页模板。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var AppView = Backbone.View.extend({AepHTML5中文学习网 - HTML5先行者学习网
template: _.template("<h3>Hello <%= who %><h3>"),AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网上面代码中,underscore函数库的template函数,接受一个模板字符串作为参数,返回对应的模板函数。有了这个模板函数,只要提供具体的值,就能生成网页代码。
AepHTML5中文学习网 - HTML5先行者学习网AepHTML5中文学习网 - HTML5先行者学习网
var AppView = Backbone.View.extend({AepHTML5中文学习网 - HTML5先行者学习网
el: $('#container'),AepHTML5中文学习网 - HTML5先行者学习网
template: _.template("<h3>Hello <%= who %><h3>"),AepHTML5中文学习网 - HTML5先行者学习网
initialize: function(){AepHTML5中文学习网 - HTML5先行者学习网
this.render();AepHTML5中文学习网 - HTML5先行者学习网
},AepHTML5中文学习网 - HTML5先行者学习网
render: function(){AepHTML5中文学习网 - HTML5先行者学习网
this.$el.html(this.template({who: 'world!'}));AepHTML5中文学习网 - HTML5先行者学习网
}AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网上面代码的render就调用了template方法,从而生成具体的网页代码。
AepHTML5中文学习网 - HTML5先行者学习网实际应用中,一般将模板放在script标签中,为了防止浏览器按照JavaScript代码解析,type属性设为text/template。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
<script type="text/template" data-name="templateName">AepHTML5中文学习网 - HTML5先行者学习网
<!-- template contents goes here -->AepHTML5中文学习网 - HTML5先行者学习网
</script>AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网可以使用下面的代码编译模板。
AepHTML5中文学习网 - HTML5先行者学习网AepHTML5中文学习网 - HTML5先行者学习网
window.templates = {};AepHTML5中文学习网 - HTML5先行者学习网
var $sources = $('script[type="text/template"]');AepHTML5中文学习网 - HTML5先行者学习网
$sources.each(function(index, el) {AepHTML5中文学习网 - HTML5先行者学习网
var $el = $(el);AepHTML5中文学习网 - HTML5先行者学习网
templates[$el.data('name')] = _.template($el.html());AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网events属性AepHTML5中文学习网 - HTML5先行者学习网
events属性用于指定视图的事件及其对应的处理函数。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var Document = Backbone.View.extend({AepHTML5中文学习网 - HTML5先行者学习网
events: {AepHTML5中文学习网 - HTML5先行者学习网
"click .icon": "open",AepHTML5中文学习网 - HTML5先行者学习网
"click .button.edit": "openEditDialog",AepHTML5中文学习网 - HTML5先行者学习网
"click .button.delete": "destroy"AepHTML5中文学习网 - HTML5先行者学习网
}AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网上面代码中一个指定了三个CSS选择器的单击事件,及其对应的三个处理函数。
AepHTML5中文学习网 - HTML5先行者学习网listento方法AepHTML5中文学习网 - HTML5先行者学习网
listento方法用于为特定事件指定回调函数。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var Document = Backbone.View.extend({AepHTML5中文学习网 - HTML5先行者学习网
initialize: function() {AepHTML5中文学习网 - HTML5先行者学习网
this.listenTo(this.model, "change", this.render);AepHTML5中文学习网 - HTML5先行者学习网
}AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网上面代码为model的change事件,指定了回调函数为render。
AepHTML5中文学习网 - HTML5先行者学习网remove方法AepHTML5中文学习网 - HTML5先行者学习网
remove方法用于移除一个视图。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
updateView: function() {AepHTML5中文学习网 - HTML5先行者学习网
view.remove();AepHTML5中文学习网 - HTML5先行者学习网
view.render();AepHTML5中文学习网 - HTML5先行者学习网
};
AepHTML5中文学习网 - HTML5先行者学习网子视图(subview)AepHTML5中文学习网 - HTML5先行者学习网
在父视图中可以调用子视图。下面就是一种写法。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
render : function (){AepHTML5中文学习网 - HTML5先行者学习网
this.$el.html(this.template());AepHTML5中文学习网 - HTML5先行者学习网
this.child = new Child();AepHTML5中文学习网 - HTML5先行者学习网
this.child.appendTo($.('.container-placeholder').render();AepHTML5中文学习网 - HTML5先行者学习网
}AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网Backbone.RouterAepHTML5中文学习网 - HTML5先行者学习网
Router是Backbone提供的路由对象,用来将用户请求的网址与后端的处理函数一一对应。AepHTML5中文学习网 - HTML5先行者学习网
首先,新定义一个Router类。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
Router = Backbone.Router.extend({AepHTML5中文学习网 - HTML5先行者学习网
routes: {AepHTML5中文学习网 - HTML5先行者学习网
}AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网routes属性AepHTML5中文学习网 - HTML5先行者学习网
Backbone.Router对象中,最重要的就是routes属性。它用来设置路径的处理方法。AepHTML5中文学习网 - HTML5先行者学习网
routes属性是一个对象,它的每个成员就代表一个路径处理规则,键名为路径规则,键值为处理方法。AepHTML5中文学习网 - HTML5先行者学习网
如果键名为空字符串,就代表根路径。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
routes: {AepHTML5中文学习网 - HTML5先行者学习网
'': 'phonesIndex',AepHTML5中文学习网 - HTML5先行者学习网
},AepHTML5中文学习网 - HTML5先行者学习网
phonesIndex: function () {AepHTML5中文学习网 - HTML5先行者学习网
new PhonesIndexView({ el: 'section#main' });AepHTML5中文学习网 - HTML5先行者学习网
}
AepHTML5中文学习网 - HTML5先行者学习网星号代表任意路径,可以设置路径参数,捕获具体的路径值。
AepHTML5中文学习网 - HTML5先行者学习网AepHTML5中文学习网 - HTML5先行者学习网
var AppRouter = Backbone.Router.extend({AepHTML5中文学习网 - HTML5先行者学习网
routes: {AepHTML5中文学习网 - HTML5先行者学习网
"*actions": "defaultRoute" AepHTML5中文学习网 - HTML5先行者学习网
}AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
var app_router = new AppRouter;AepHTML5中文学习网 - HTML5先行者学习网
app_router.on('route:defaultRoute', function(actions) {AepHTML5中文学习网 - HTML5先行者学习网
console.log(actions);AepHTML5中文学习网 - HTML5先行者学习网
})
AepHTML5中文学习网 - HTML5先行者学习网上面代码中,根路径后面的参数,都会被捕获,传入回调函数。
AepHTML5中文学习网 - HTML5先行者学习网路径规则的写法。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var myrouter = Backbone.Router.extend({AepHTML5中文学习网 - HTML5先行者学习网
routes: {AepHTML5中文学习网 - HTML5先行者学习网
"help": "help", AepHTML5中文学习网 - HTML5先行者学习网
"search/:query": "search" AepHTML5中文学习网 - HTML5先行者学习网
},AepHTML5中文学习网 - HTML5先行者学习网
help: function() {AepHTML5中文学习网 - HTML5先行者学习网
...AepHTML5中文学习网 - HTML5先行者学习网
},AepHTML5中文学习网 - HTML5先行者学习网
search: function(query) {AepHTML5中文学习网 - HTML5先行者学习网
...AepHTML5中文学习网 - HTML5先行者学习网
}AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
routes: {AepHTML5中文学习网 - HTML5先行者学习网
"help/:page": "help",AepHTML5中文学习网 - HTML5先行者学习网
"download/*path": "download",AepHTML5中文学习网 - HTML5先行者学习网
"folder/:name": "openFolder",AepHTML5中文学习网 - HTML5先行者学习网
"folder/:name-:mode": "openFolder"AepHTML5中文学习网 - HTML5先行者学习网
}AepHTML5中文学习网 - HTML5先行者学习网
router.on("route:help", function(page) {AepHTML5中文学习网 - HTML5先行者学习网
...AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网Backbone.historyAepHTML5中文学习网 - HTML5先行者学习网
设置了router以后,就可以启动应用程序。Backbone.history对象用来监控url的变化。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
App = new Router();AepHTML5中文学习网 - HTML5先行者学习网
$(document).ready(function () {AepHTML5中文学习网 - HTML5先行者学习网
Backbone.history.start({ pushState: true });AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网打开pushState方法。如果应用程序不在根目录,就需要指定根目录。
AepHTML5中文学习网 - HTML5先行者学习网AepHTML5中文学习网 - HTML5先行者学习网
Backbone.history.start({pushState: true, root: "/public/search/"})AepHTML5中文学习网 - HTML5先行者学习网
Backbone.ModelAepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网Model代表单个的对象实体。
AepHTML5中文学习网 - HTML5先行者学习网AepHTML5中文学习网 - HTML5先行者学习网
var User = Backbone.Model.extend({AepHTML5中文学习网 - HTML5先行者学习网
defaults: {AepHTML5中文学习网 - HTML5先行者学习网
name: '',AepHTML5中文学习网 - HTML5先行者学习网
email: ''AepHTML5中文学习网 - HTML5先行者学习网
}AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
var user = new User();AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网上面代码使用extend方法,生成了一个User类,它代表model的模板。然后,使用new命令,生成一个Model的实例。defaults属性用来设置默认属性,上面代码表示user对象默认有name和email两个属性,它们的值都等于空字符串。
AepHTML5中文学习网 - HTML5先行者学习网生成实例时,可以提供各个属性的具体值。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var user = new User ({AepHTML5中文学习网 - HTML5先行者学习网
id: 1,AepHTML5中文学习网 - HTML5先行者学习网
name: 'name',AepHTML5中文学习网 - HTML5先行者学习网
email: 'name@email.com'AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网上面代码在生成实例时,提供了各个属性的具体值。
AepHTML5中文学习网 - HTML5先行者学习网idAttribute属性AepHTML5中文学习网 - HTML5先行者学习网
Model实例必须有一个属性,作为区分其他实例的主键。这个属性的名称,由idAttribute属性设定,一般是设为id。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var Music = Backbone.Model.extend({ AepHTML5中文学习网 - HTML5先行者学习网
idAttribute: 'id'AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网get方法AepHTML5中文学习网 - HTML5先行者学习网
get方法用于返回Model实例的某个属性的值。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var user = new User({ name: "name", age: 24});AepHTML5中文学习网 - HTML5先行者学习网
var age = user.get("age"); // 24AepHTML5中文学习网 - HTML5先行者学习网
var name = user.get("name"); // "name"AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网set方法AepHTML5中文学习网 - HTML5先行者学习网
set方法用于设置Model实例的某个属性的值。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var User = Backbone.Model.extend({AepHTML5中文学习网 - HTML5先行者学习网
buy: function(newCarsName){AepHTML5中文学习网 - HTML5先行者学习网
this.set({car: newCarsName });AepHTML5中文学习网 - HTML5先行者学习网
}AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
var user = new User({name: 'BMW',model:'i8',type:'car'});AepHTML5中文学习网 - HTML5先行者学习网
user.buy('Porsche');AepHTML5中文学习网 - HTML5先行者学习网
var car = user.get("car"); // ‘Porsche'AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网on方法AepHTML5中文学习网 - HTML5先行者学习网
on方法用于监听对象的变化。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var user = new User({name: 'BMW',model:'i8'});AepHTML5中文学习网 - HTML5先行者学习网
user.on("change:name", function(model){AepHTML5中文学习网 - HTML5先行者学习网
var name = model.get("name"); // "Porsche"AepHTML5中文学习网 - HTML5先行者学习网
console.log("Changed my car's name to " + name);AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
user.set({name: 'Porsche'}); AepHTML5中文学习网 - HTML5先行者学习网
// Changed my car's name to PorscheAepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网上面代码中的on方法用于监听事件,“change:name”表示name属性发生变化。
AepHTML5中文学习网 - HTML5先行者学习网urlroot属性AepHTML5中文学习网 - HTML5先行者学习网
该属性用于指定服务器端对model进行操作的路径。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var User = Backbone.Model.extend({AepHTML5中文学习网 - HTML5先行者学习网
urlRoot: '/user'AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网上面代码指定,服务器对应该Model的路径为/user。AepHTML5中文学习网 - HTML5先行者学习网
fetch事件AepHTML5中文学习网 - HTML5先行者学习网
fetch事件用于从服务器取出Model。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var user = new User ({id: 1});AepHTML5中文学习网 - HTML5先行者学习网
user.fetch({AepHTML5中文学习网 - HTML5先行者学习网
success: function (user){AepHTML5中文学习网 - HTML5先行者学习网
console.log(user.toJSON());AepHTML5中文学习网 - HTML5先行者学习网
}AepHTML5中文学习网 - HTML5先行者学习网
})
AepHTML5中文学习网 - HTML5先行者学习网上面代码中,user实例含有id属性(值为1),fetch方法使用HTTP动词GET,向网址“/user/1”发出请求,从服务器取出该实例。
AepHTML5中文学习网 - HTML5先行者学习网save方法AepHTML5中文学习网 - HTML5先行者学习网
save方法用于通知服务器新建或更新Model。AepHTML5中文学习网 - HTML5先行者学习网
如果一个Model实例不含有id属性,则save方法将使用POST方法新建该实例。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var User = Backbone.Model.extend({AepHTML5中文学习网 - HTML5先行者学习网
urlRoot: '/user'AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
var user = new User ();AepHTML5中文学习网 - HTML5先行者学习网
var userDetails = {AepHTML5中文学习网 - HTML5先行者学习网
name: 'name',AepHTML5中文学习网 - HTML5先行者学习网
email: 'name@email.com'AepHTML5中文学习网 - HTML5先行者学习网
};AepHTML5中文学习网 - HTML5先行者学习网
user.save(userDetails, {AepHTML5中文学习网 - HTML5先行者学习网
success: function (user) {AepHTML5中文学习网 - HTML5先行者学习网
console.log(user.toJSON());AepHTML5中文学习网 - HTML5先行者学习网
}AepHTML5中文学习网 - HTML5先行者学习网
})AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网上面代码先在类中指定Model对应的网址是/user,然后新建一个实例,最后调用save方法。它有两个参数,第一个是实例对象的具体属性,第二个参数是一个回调函数对象,设定success事件(保存成功)的回调函数。具体来说,save方法会向/user发出一个POST请求,并将{name: ‘name', email: ‘name@email.com'}作为数据提供。
AepHTML5中文学习网 - HTML5先行者学习网如果一个Model实例含有id属性,则save方法将使用PUT方法更新该实例。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var user = new User ({AepHTML5中文学习网 - HTML5先行者学习网
id: 1,AepHTML5中文学习网 - HTML5先行者学习网
name: '张三',AepHTML5中文学习网 - HTML5先行者学习网
email: 'name@email.com'AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
user.save({name: '李四'}, {AepHTML5中文学习网 - HTML5先行者学习网
success: function (model) {AepHTML5中文学习网 - HTML5先行者学习网
console.log(user.toJSON());AepHTML5中文学习网 - HTML5先行者学习网
}AepHTML5中文学习网 - HTML5先行者学习网
});
AepHTML5中文学习网 - HTML5先行者学习网上面代码中,对象实例含有id属性(值为1),save将使用PUT方法向网址“/user/1”发出请求,从而更新该实例。
AepHTML5中文学习网 - HTML5先行者学习网destroy方法AepHTML5中文学习网 - HTML5先行者学习网
destroy方法用于在服务器上删除该实例。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var user = new User ({AepHTML5中文学习网 - HTML5先行者学习网
id: 1,AepHTML5中文学习网 - HTML5先行者学习网
name: 'name',AepHTML5中文学习网 - HTML5先行者学习网
email: 'name@email.com'AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
user.destroy({AepHTML5中文学习网 - HTML5先行者学习网
success: function () {AepHTML5中文学习网 - HTML5先行者学习网
console.log('Destroyed');AepHTML5中文学习网 - HTML5先行者学习网
}AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网上面代码的destroy方法,将使用HTTP动词DELETE,向网址“/user/1”发出请求,删除对应的Model实例。
AepHTML5中文学习网 - HTML5先行者学习网Backbone.CollectionAepHTML5中文学习网 - HTML5先行者学习网
Collection是同一类Model的集合,比如Model是动物,Collection就是动物园;Model是单个的人,Collection就是一家公司。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var Song = Backbone.Model.extend({});AepHTML5中文学习网 - HTML5先行者学习网
var Album = Backbone.Collection.extend({AepHTML5中文学习网 - HTML5先行者学习网
model: SongAepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网上面代码中,Song是Model,Album是Collection,而且Album有一个model属性等于Song,因此表明Album是Song的集合。
AepHTML5中文学习网 - HTML5先行者学习网add方法,remove方法AepHTML5中文学习网 - HTML5先行者学习网
Model的实例可以直接放入Collection的实例,也可以用add方法添加。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var song1 = new Song({ id: 1 ,name: "歌名1", artist: "张三" });AepHTML5中文学习网 - HTML5先行者学习网
var song2 = new Music ({id: 2,name: "歌名2", artist: "李四" });AepHTML5中文学习网 - HTML5先行者学习网
var myAlbum = new Album([song1, song2]);AepHTML5中文学习网 - HTML5先行者学习网
var song3 = new Music({ id: 3, name: "歌名3",artist:"赵五" });AepHTML5中文学习网 - HTML5先行者学习网
myAlbum.add(song3);AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网remove方法用于从Collection实例中移除一个Model实例。
AepHTML5中文学习网 - HTML5先行者学习网AepHTML5中文学习网 - HTML5先行者学习网
myAlbum.remove(1);AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网上面代码表明,remove方法的参数是model实例的id属性。
AepHTML5中文学习网 - HTML5先行者学习网get方法,set方法AepHTML5中文学习网 - HTML5先行者学习网
get方法用于从Collection中获取指定id的Model实例。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
myAlbum.get(2))AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网fetch方法AepHTML5中文学习网 - HTML5先行者学习网
fetch方法用于从服务器取出Collection数据。AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网
var songs = new Backbone.Collection;AepHTML5中文学习网 - HTML5先行者学习网
songs.url = '/songs';AepHTML5中文学习网 - HTML5先行者学习网
songs.fetch();AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网Backbone.events
AepHTML5中文学习网 - HTML5先行者学习网AepHTML5中文学习网 - HTML5先行者学习网
var obj = {};AepHTML5中文学习网 - HTML5先行者学习网
_.extend(obj, Backbone.Events);AepHTML5中文学习网 - HTML5先行者学习网
obj.on("show-message", function(msg) {AepHTML5中文学习网 - HTML5先行者学习网
$('#display').text(msg);AepHTML5中文学习网 - HTML5先行者学习网
});AepHTML5中文学习网 - HTML5先行者学习网
obj.trigger("show-message", "Hello World");AepHTML5中文学习网 - HTML5先行者学习网
AepHTML5中文学习网 - HTML5先行者学习网