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);