backbone
Backbone.js提供模型(models)、集合(collections)、視圖(views)的結構。
-
Models: 是引用程序的核心,也是表示數據,用於綁定鍵值數據和自定義事件
-
Collectoins:是對Model的一個容器,包含多個模型,並提供一些方法,來訪問這些模型,集合附有可枚舉函數的豐富API
-
View:可以在視圖中聲明時間,在視圖中處理集合或者模型,也可以地工藝方法啊,可以暴露出來一些藉口,視圖可以聲明事件處理函數,並通過接口連接到應用程序。
-
Router: 路由, 看作簡化版的控制器。(Backbone弱化了Controller)
使用
依賴的工具庫
jquery.js,zepto.js 等
underscore.js/lodash.js 等
Model
創建模型
//構造函數:
var pink = new Backbone.Model({
color: 'pink'
});
//extend:
var Pink = Backbone.Model.extend({});
var p = new Pink({
color: 'pink'
});
默認值
defaults: 表示模型類的默認值, 當模型實例化的時候,這些默認值就會被賦值上。
var WangCai = Backbone.Model.extend({
//默認值
defaults: {
kg: 20,
name: 'wangcai',
age: 2
}
});
initalize
initialize: 在模型對象的實例化時,構造函數可以對模型再次更改
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
Json 轉化
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'
});
Model事件
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})
View
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'
})
}
});
view實例化對象
cid: 該視圖實例化id
el: 該元素
$el: jquery的對象
視圖元素
el:表示視圖的元素
實例化創建添加屬性
var divView = new App({
el: $('#app')
});
initialze
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();
view 事件監聽
events: 基於委託模式,對el元素委託
{
'事件名 委託元素的選擇器': '事件回調方法'
}
var ItemView = Backbone.View.extend({
tpl: _.template($('#itemView').html()),
events: {
'mouseleave .item': 'hideSeeDom'
},
hideSeeDom: function (e) {
this.$('.see').hide().css('top', 290)
}
})
collection
集合:表示數據模型的一個有序集合
-
每個方法都有返回值
-
每個方法通常會有一個對應的事件,這個事件的名稱大部分是方法的名稱
創建collection
var ItemContainer = Backbone.Collection.extend({
model: ItemModel //集合對應的模型
});
實例化collection
//可以傳遞 js 對象,但是沒有id {} ,不建議
var item = new ItemModel();
var itemContainer = new ItemContainer(item); //一個 模型
var itemContainer = new ItemContainer([item1,item2]); //多個模型
collection添加模型
向集合中增加一個模型(或一個模型數組),會觸發"add"事件.
重複添加模型實例化對象會被去重的
var item = new ItemModel();
itemContainer.add(item);
itemContainer.add([item1]);
轉成JSON
可以將一個集合轉化為一個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 initialize
collection構造函數,是在collection被實例化的時候調用,在它裏面添加的事件會監聽所有的實例化對象
var IterContainer = Backbone.Collection.extend({
model: ItemModel,
initialize: function () {
this.on('add',function ( model ) {
console.log(model); //false
});
}
});
collection events
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 );
});
重置collection
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 );
});
}
}
collection 映射數據
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' );
}
});
路由 router
//路由
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();
Events
在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');
M、V、Collections消息監聽
//模型 和 視圖 之間的 事件聯繫 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);