Backbone: 依赖underscore.js
Model:
1. Backbone.Model.extend();创建一个Model2. var User = Backbone.Model.extend({
initialize: function(name){
this.set({name: name});
}
});
initialize()可以接受任意实力参数: var user = new User('janey'); janey即name; user.get('name')= 'janey'
3. var User = Backbone.Model.extend({
validate: function(atts){
//........
}
});
validate(): 模型和属性合法,不返回任何东西;不合法,返回错误信息;校验失败,set()和save()方法不再继续,出发error事件
4. var User = Backbone.Model.extend({
default: {
//默认属性
}
});
创建实例时,任何没有指定的属性都会被设置成默认属性.
在创建View是当作参数传给view: new View({model: modelName});
在template中<%- modelKeyName %>或<%= modelKeyName == "xxxx" ? "yyy" : "zzz" %>与model的属性绑定
Collection:
1. var Users = Backbone.Collection.extend({model: User
});
(1). var users = new Users([{name: 'ddd'}, {name: 'aaa'}]);//初始化时传递一个模型数组
(2). var users = new Users;
users.add({name: 'ddd'});//添加单独模型
users.add([{name: 'ddd'}, {name: 'aaa'}]);//添加模型组成数组
(3). users.bind('add', function(user){
//......
});//在为集合添加一个模型时触发
users.bind('remove', function(){
//......
});//从集合删除一个模型是触发
usres.remove(users.models[0]);//删除一个模型
2. 取指定模型:
(1). var user = users.get('model-id');//有模型ID
(2). var user = users.getByCid('cid');//创建一个新模型是由Backbone自动创建的客户ID
3. 当Collection中的Model改变,触发change事件
eg: var user = new User({name: 'aaa'});
var users = new Backbone.Collection;
users.bind('change', function(){
//......
});
user.add(user);
user.set({name: 'bbb'});//触发change事件
4. 集合排序
var Users = Backbone.Collection.extend({
comparator: function(user){
return user.get('name');//返回值表示希望集合内部元素按何种规则排序;
}
});
//conparator将在后台自动完成排序,如要强制执行重新排序,用sort();
View:
1. var UserView = Backbone.View.extend({tagName: 'span',
className: 'users',
initialize: function(){//......},
render: function(){//......}
});
每个View的实例都知道当前的DOM元素,即this.el; el是从View的tagName, className,id等出行中创建出来的元素,如果没有指定,el为div
2. var UserView = Backbone.View.extend({
//将View绑定到页面已经存在的元素上
el: '#elmentId',
//渲染视图
template: _.template($('#template').html()),
render: function(){
this.$el.html(this.template(//model data.....));
return this;
},
//事件
evetns: {
'click #id': 'handler',
//......
},
handler: function(){
//......
}
});
Router:
1. var router = Backbone.Router.extend({routers: {
' ': 'index',
'help': 'help', //#help: (localhost:8080/project_name/#help)
'search/:query': 'search', //#search/kiwis: (参数以:开始)
'search/:query/p:page': 'search', //#search/kiwis/p7: ()
'file/*path': 'file', //#file/any/path.txt:(*为通配符,匹配所有,位于routes哈希对象的尾部)
},
});
2. *如果想要应用程序既适用Ajax Crawling规范,也能被搜索引擎索引,所有router前缀为 "!/" ,
routers: {
'!/page/:title': page,
},
且根据规范,服务端要做一些相应的修改
3. Backbone.history.start(); //开启Backbone的history支持监听浏览器onhashchange事件
Model与服务器的同步:
1. 默认保存Model,Backbone就会用Ajax请求通知服务器,可以使用jquery, Zepto.js等类库2. create, update, delete一个Model,Backbone通过调用Backbone.sync()实现,Backbone发起REST形式的JSON请求到服务器,成功:更新客户端Model。
3. 使用同步特性,Model要定义一个url,且服务端处理请求符合REST形式:
var User = Backbone.Model.extend({
url: '/users',
});
//url属性可以是字符串,也可以是返回字符串的函数,路径可以相对,可以绝对,但要返回模型端点
4. Backbone CURD:
create---->POST //collection
read------>GET //collection/[id]
update---->PUT //collection/id
delete---->DELETE //collection/id
Model保存: user.save({key: value});
fetch(): GET请求刷新model,如果远程model与当前model数据不一样,触发change事件
填充Collection:
1. Collection:用来请求远程的model并保存在本地,须给collection指定url属性来设置它的端点,如果没有,Backbone使用与之关联的model的url:var Followers = Backbone.Collection.extend({
model: User,
url: '/followers'
});
fetch():发送GET请求,获取远程model,当数据返回后,collection刷新,触发refresh事件