Backbone.js提供模型(models)、集合(collections)、视图(views)的结构。css
Models: 是引用程序的核心,也是表示数据,用于绑定键值数据和自定义事件html
Collectoins:是对Model的一个容器,包含多个模型,并提供一些方法,来访问这些模型,集合附有可枚举函数的丰富APIjquery
View:能够在视图中声明时间,在视图中处理集合或者模型,也能够地工艺方法啊,能够暴露出来一些借口,视图能够声明事件处理函数,并经过接口链接到应用程序。json
Router: 路由, 看做简化版的控制器。(Backbone弱化了Controller)数组
使用
依赖的工具库
jquery.js,zepto.js 等
underscore.js/lodash.js 等app
//构造函数: var pink = new Backbone.Model({ color: 'pink' });
//extend: var Pink = Backbone.Model.extend({}); var p = new Pink({ color: 'pink' });
defaults: 表示模型类的默认值, 当模型实例化的时候,这些默认值就会被赋值上。dom
var WangCai = Backbone.Model.extend({ //默认值 defaults: { kg: 20, name: 'wangcai', age: 2 } });
initialize: 在模型对象的实例化时,构造函数能够对模型再次更改ide
var WangCai = Backbone.Model.extend({ //构造函数 initialize: function () { if ( this.attributes.price ) { this.attributes.onSale = true; } } });
get,获取模型实例化对象属性的方法,直接在模型实例化对象上调用
参数:表示属性值函数
var WangCai = Backbone.Model.extend({ //默认值 defaults: { kg: 20, name: 'wangcai', age: 2 }, //构造函数 initialize: function () { if ( this.attributes.price ) { this.attributes.onSale = true; } } }); var ww = new WangCai({ price: 1000 }); var price = ww.get('price'); console.log( price ); //1000
toJSON: 将模型对象的attributes属性转化为JSON对象,该方法直接在模型对象上调用
等同于JSON.parse(JSON.stringify(clothes))方法工具
var clothes = new Clothes({ price: 158 }) var attributes = clothes.toJSON();
set()
设置模型实例化对象属性方法,直接在实例化模型对象上调用
第一种传参方式
参数1,属性名称
参数2,属性值
第二种传参方式
传递一个对象,这个对象映射到模型的attributes上的属性对象
var ww = new WangCai({ price: 1000 }); ww.set('color','pink'); ww.set({ say: function () {}, zf: 'dd' });
Backbone实例对象的继承Backbone.Model,Backbone.Model继承了事件的方法,因此就能够在构造函数中使用绑定事件的方法on,经过this访问
on方法的使用:
第一个参数表示事件的名称
第二个参数表示事件的回调函数
当调用set添加属性时候会触发change事件,但set传递{silent: true}参数时候,该事件就不能被触发了
//构造函数 initialize: function () { //on事件可使用命名空间 this.on('change',function ( model ) { console.log(123); }); }
ww.set({ say: function () {}, zf: 'dd' },{silent: true }); //添加属性不被事件捕获, 经过 set的第二个参数 {silent: true} 来设置
hasChanged() 当模型调用了set更改属性的时候,该方法返回true,表示被修改过。
// ww 实例对象 未被修改 console.log( ww.hasChanged() );// false // ww.set('color','pink',{silent: true }); ww.set({ say: function () {}, zf: 'dd' },{silent: true }); //实例对象 已经被修改,添加 其它属性和方法 console.log( ww.hasChanged() );// true
unset() 删除模型实例化对象上属性, 直接在实例化对象上调用
参数1:删除的属性名
参数2:一些配置
ww.unset('zf');
validate:检验删除是否合理,可是删除方法unset时候,必须传递{validate: true}才能校验
validate 验证删除是否合理,在unset第二个参数传递。
参数,是该实例化对象的attributes对象
返回:
true 删除失败
false 删除成功
ww.validate = function (attr) { if (!attr.width) { return true; } return false; } // 验证删除操做 var result = a.unset('width', {validate: true})
backbone 视图层
//构造函数 var App = new Backbone.View({ tanName: 'h1', id: 'app', className: 'app' });
// extend var App = Backbone.View.extend({ initialize: function () { this.$el.html('¥79.00').css({ 'background': 'tan' }) } });
cid: 该视图实例化id
el: 该元素
$el: jquery的对象
el:表示视图的元素
实例化建立添加属性
var divView = new App({ el: $('#app') });
initialze 表示视图类的构造函数
var App = Backbone.View.extend({ initialize: function () { this.$el.html('¥79.00').css({ 'background': 'tan' }) } });
setElement 将新元素替换原有的元素
divView.setElement();
参数能够是字符串,那么就将该字符串渲染成元素
参数也能够是dom元素,那么就直接该元素替换
在实例化后更改,因此不会影响到原构造函数已经执行的逻辑
divView.setElement('<h1>123</h1>');
$:视图实例化对象为咱们提供了一个方法来获取其自身的元素
this.$el.html();
template, underscore提供获取并格式化模板的方法
tpl: _.template('<div>¥<%= price%></div>');
//moduel var Price = Backbone.Model.extend({ defaults: { price: 100, info: 'xixihaha' } }) //view var View = Backbone.View.extend({ model: new Price(), tpl: _.template('<div><span class="price">¥<%= price%></span><span class="mail"><%= info%></span></div>'), initialize: function () { //数据 var data = this.model.toJSON(); //html var html = this.tpl(data); this.$el.html(html).css('background','pink'); } }) var appView = new View({ // model: new Price(), //model 也能够在 new View() 实例化的时候 进行 el: $('#app') });
render:为了让视图实例对象能够在外部渲染视图,定义的方法
// 视图 var App = Backbone.View.extend({ render: function () { // 渲染父页面的视图 var item = new Item({ model: new Price() //子视图实例化 }) item.render(); // console.log(item.el) this.$el.append(item.el) } }); var app = new App({ el: $('#app') }); app.render();
events: 基于委托模式,对el元素委托
{ '事件名 委托元素的选择器': '事件回调方法' }
var ItemView = Backbone.View.extend({ tpl: _.template($('#itemView').html()), events: { 'mouseleave .item': 'hideSeeDom' }, hideSeeDom: function (e) { this.$('.see').hide().css('top', 290) } })
集合:表示数据模型的一个有序集合
每一个方法都有返回值
每一个方法一般会有一个对应的事件,这个事件的名称大部分是方法的名称
var ItemContainer = Backbone.Collection.extend({ model: ItemModel //集合对应的模型 });
//能够传递 js 对象,可是没有id {} ,不建议 var item = new ItemModel(); var itemContainer = new ItemContainer(item); //一个 模型 var itemContainer = new ItemContainer([item1,item2]); //多个模型
向集合中增长一个模型(或一个模型数组),会触发"add"事件.
重复添加模型实例化对象会被去重的
var item = new ItemModel(); itemContainer.add(item); itemContainer.add([item1]);
能够将一个集合转化为一个JSON对象
获得的结果是一个新的对象,不是对原有对象的引用
itemContainer.toJSON()
get :接收模型参数,接收id,或者cid(若是对象有id,能够经过对象获取,若是对象没有id就不能经过id获取)
在建立模型的时,传递id属性,此时,id属性会被传递到模型的最外成属性(attributes,cid,changed在一个层次)
itemContainer.get(item); itemContainer.get(id); itemContainer.get(cid);
remove:删除集合中的模型
能够传递一个模型
也能够传递一个模型组成的数组
还能够传递一个具备id的对象
返回的结果是删除的模型实例化对象
itemContainer.remove(item); itemContainer.remove([item,time2]); // remove 函数 //collection var ItemCollection = Backbone.Collection.extend({ model: ItemModel, initialize: function () { this.on('remove',function ( model ) { console.log( model ); }); } })
collection构造函数,是在collection被实例化的时候调用,在它里面添加的事件会监听全部的实例化对象
var IterContainer = Backbone.Collection.extend({ model: ItemModel, initialize: function () { this.on('add',function ( model ) { console.log(model); //false }); } });
collection 添加事件,事件有两种添加方式
添加在构造函数内,此时会监听全部实例化对象
添加在实例化对象上,只能监听后面添加的行为,只能监听该实例化对象上添加行为
//collection var ItemCollection = Backbone.Collection.extend({ model: ItemModel, initialize: function () { // add 添加 //在 initialize内添加 this.on('add',function (model) { console.log( model ); }); } }) //itemCollection.add([item,item2]); 触发事件
//实例化对象上添加 itemContainer.on('add', function ( model ) { console.log( model ); });
reset() 清空collection
reset事件与其余方法的事件的区别,reset事件的回调函数中的参数是一个集合实例化对象,该对象就是构造函数中的this,
其余方法的事件的回调函数的参数是一个模型实例化对象,不等于构造函数中的this
reset事件与其余方法的事件区别,reset事件的回调函数中的参数是一个集合实例化对象,该对象就是构造函数中的this。
其它方法的时间的回调函数
colletion.reset(); //reset 事件 //collection var ItemCollection = Backbone.Collection.extend({ model: ItemModel, initialize: function () { //绑定事件 this.on('reset',function ( model ) { console.log( model ); }); } }
fetch
从服务端拉取数据映射到集合中
注意:在collection中 声明属性 url
var ItemModel = Backbone.Model.extend({}); var ListCollection = Backbone.Collection.extend({ model: ItemModel, url: 'data/list.json', //声明 initialize: function () { this.on('add',function ( model ) { console.log( model ); }); } }); var listCollection = new ListCollection(); //拉取数据 listCollection.fetch({ success: function ( collections ) { console.log( collections,'collections' ); } });
//路由 var Routers = Backbone.Router.extend({ routes: { home: 'showHome', 'en/ch/:dict': 'showSerch' }, showHome: function () { console.log('showHome'); }, showSerch: function ( dict ) { var dictView = new DictView({ el: $('.div') }); dictView.render( dict ); } }); var router = new Routers(); //开启 路由 //须要在 history 开始 Backbone.history.start();
经过 '/' 进行路由切分,自由匹配获取,再前面加':' (注意:第一个'/'无关紧要)
#search/:query:page
*other 表示其它不匹配的规则都到该路由下,一般将该规则放到最后
var Routers = Backbone.Router.extend({ routes: { home: 'showHome', 'en/ch/:dict': 'showSerch', '*other': 'showDefault' }, showHome: function () { console.log('showHome'); }, showSerch: function ( dict ) { var dictView = new DictView({ el: $('.div') }); dictView.render( dict ); }, showDefault: function () { console.log('showDefault'); } }); var router = new Routers(); //开启 路由 Backbone.history.start();
在backbone中用events表示事件对象,可是它是单体对象,不要直接使用它,将它的属性和方法继承下来。
为了不冲突,须要使用空对象添加属性和方法。
var myEvent = _.extend({}, Backbone.Events);
on方法订阅事件
var EventsModel = Backbone.Model.extend(); var events = new EventsModel(); events.on('dd',function ( msg ) { console.log( msg ); });
trigger()
events.trigger('dd','info');
off()
注销事件,写在触发事件的前面
注销带有命名空间的事件,须要添加上命名空间
myEvent.off('change') myEvent.off('change:color')
stopListening()
参数:
能够不传,取消全部对全部对象的监听
一个参数:被监听的对象,此时取消该对象上的全部的事件监听
两个参数:此时取消该对象上该事件的监听
// 取消监听 ev1.stopListening(); // 仅仅取消对ev2的监听 ev1.stopListening(ev2); // 仅仅取消ev2上面的change事件 ev1.stopListening(ev2, 'change');
//多个事件 联系 var ev1 = _.extend({},Backbone.Events); var ev2 = _.extend({},Backbone.Events); var ev3 = _.extend({},Backbone.Events); ev2.listenTo(ev1, 'change', function ( msg ) { console.log( msg ); }); ev2.listenTo(ev1, 'add', function ( msg ) { console.log(msg); }); ev2.listenTo(ev1, 'dd', function ( msg ) { console.log(msg); }); ev2.stopListening(ev1, 'change'); ev1.trigger('change', 'hello'); ev1.trigger('add', 'world'); ev1.trigger('dd', 'pink');
//模型 和 视图 之间的 事件联系 collection 和 view 之间的联系 var eventModel = new Backbone.Model(); var eventView = new Backbone.View(); var EventCollection = Backbone.Collection.extend(); var eventCollection = new EventCollection(); eventView.listenTo(eventModel,'change',function ( msg ) { console.log(msg); }); eventView.listenTo(eventCollection, 'remove', function ( msg ) { console.log( msg,'--' ); }); eventModel.set({ color: 'pink', age: 2 }); eventCollection.add(eventModel); eventCollection.remove(eventModel);