數(shù)據(jù)模型
model可以對應(yīng)到數(shù)據(jù)庫中的某條數(shù)據(jù)
創(chuàng)建數(shù)據(jù)模型
// 定義某類的默認(rèn)模型值
var Book = Backbon.Model.extend({
defaults: {
name: 'unknown',
author: 'unknown',
price: 0
}
});
// 設(shè)置實(shí)例的模型值
var book = new Book({
name: 'yf',
author: 'noting',
price: 11
});
- 從Backbone模塊繼承的子類都有靜態(tài)屬性
__super__,靜態(tài)屬性和靜態(tài)方法就是不用創(chuàng)建實(shí)例就可以使用的方法
初始化和讀取數(shù)據(jù)
- 通過
new初始化數(shù)據(jù) - 通過以下方法讀取數(shù)據(jù)
modelInstance.get()-
modelInstance.escape()防XXS攻擊 -
modelInstance.previous()獲取模型改變之前的數(shù)據(jù),××但是××只能在change事件和屬性事件中使用
- 所有的數(shù)據(jù)存儲在
modelInstance.attributes中,但是不建議用它獲取數(shù)據(jù)和改變數(shù)據(jù)
-
model.previousAttributes()使用場景和previous相同
修改數(shù)據(jù)
modelInstance.set()- 當(dāng)修改數(shù)據(jù)時,會出發(fā)change事件。通過
modelInstance對事件的監(jiān)聽,作出響應(yīng) -
change事件的兩個參數(shù),model模型本身,當(dāng)是屬性事件的時候有第二個參數(shù)value
// 一般這種會通過 listenTO 放到 view 中,因?yàn)楸O(jiān)聽model 上事件,一般是 view 作出改變
// 是否觸發(fā)change事件和屬性事件,是看值是否發(fā)生了改變。如果沒有,即使set,也不觸發(fā)
modelInstance.on('change',function () {});
// 屬性事件
modelInstance.on('change:name',function () {});
數(shù)據(jù)驗(yàn)證
數(shù)據(jù)驗(yàn)證這一項(xiàng)是個函數(shù),該函數(shù)會在模型數(shù)據(jù)發(fā)生改變之前進(jìn)行進(jìn)檢驗(yàn)。有返回值,無論什么,
return false都是沒有通過驗(yàn)證。不返回值的時候,通過驗(yàn)證
- 數(shù)據(jù)驗(yàn)證對應(yīng)有
error方法,modelInstance.on('error',function(){}) -
modelInstance.set可以添加對象,設(shè)置該對象的silent選項(xiàng),本次不會進(jìn)行validate檢驗(yàn),但是下次set并且沒有silent時,還是會觸發(fā)。同時,當(dāng)本次設(shè)置出錯時,不會報(bào)錯,不會出發(fā)change事件 -
modelInstance.set可以添加對象,設(shè)置該對象的error選項(xiàng)。優(yōu)先于error事件 -
error事件,有兩個參數(shù)model和error。第一個模型對象,第二個是validate中返回的數(shù)據(jù)。
// 簡單類型
var Book = Backbone.Model.extend({
validate: function (attrs) {
// attrs 是實(shí)例上的attributes
}
});
刪除數(shù)據(jù)
會觸發(fā)change事件,當(dāng)刪除模型中某個數(shù)據(jù)項(xiàng)時,再獲取為
undefined
modelInstance.unset(name)modelInstance.clear()
將模型數(shù)據(jù)同步到服務(wù)器
- 數(shù)據(jù)標(biāo)識。模型向服務(wù)器發(fā)送請求,比如修改或者刪除,但是需要帶上model的id。這個是model發(fā)送請求的時候,自動添加的。
- url規(guī)則。
urlRoot方式,發(fā)送請求是請求地址加上數(shù)據(jù)標(biāo)識。url方式,發(fā)送請求沒有數(shù)據(jù)表示。兩者的區(qū)別
-
urlRoot方式,服務(wù)器接口根目錄,但是我們無權(quán)訪問,需要使用id組成最終地址。優(yōu)先級第三。 -
url方式,服務(wù)器接口地址是已知的,這個地址對應(yīng)的操作無需模型的id。優(yōu)先級第二。 -
modelInstance.set第三個參數(shù)對象可以添加url選項(xiàng)。優(yōu)先級第一
- 數(shù)據(jù)和服務(wù)器數(shù)據(jù)進(jìn)行同步。
-
modelInstance.save(),這個方法向服務(wù)器發(fā)送請求,同時將響應(yīng)數(shù)據(jù)設(shè)置給模型。但是,設(shè)置給model的時候,會先經(jīng)過parse- 該方法,可以設(shè)置第一個參數(shù),數(shù)據(jù)對象
- 第二個參數(shù),
wait選項(xiàng),后臺無響應(yīng)或響應(yīng)出錯,model不會改變 - 第二個參數(shù),
url選項(xiàng) - 第二個參數(shù),
success選項(xiàng),error選項(xiàng) - 當(dāng)使用
save時,內(nèi)部自動調(diào)用isNew。此時,如果沒有id,將被認(rèn)為是新的數(shù)據(jù),使用post方式發(fā)送。如果服務(wù)器不返回帶有id的響應(yīng)數(shù)據(jù),那么再次使用save時,依舊會使用post方式發(fā)送 - 使用
save的時候會觸發(fā)三個事件,change,request,sync/error。change發(fā)生的事件不定。因?yàn)?code>set發(fā)生在什么時候是可以配置的,如果有validate還可能會觸發(fā)errro事件。 - 使用
save方法后,可以設(shè)置回調(diào),但是回調(diào)中一般不要有對模型的改變,可以在change事件中改變 - 使用
parse方法對返回?cái)?shù)據(jù)進(jìn)行處理,然會return,這樣模型上數(shù)據(jù)能夠結(jié)構(gòu)正確
-
modelInstance.fetch()- 參數(shù)和
save的第二個參數(shù)相同 - 會觸發(fā)的事件有
change,request,sync/error - 客戶端新創(chuàng)建的模型沒有id,依舊可以使用
fetch拉取數(shù)據(jù)
- 參數(shù)和
-
modelInstance.destroy()- 第一個參數(shù),
wait選項(xiàng),后臺無響應(yīng)或響應(yīng)出錯,model不會改變 - 會觸發(fā)
destory,request,sync事件。
- 第一個參數(shù),
應(yīng)用
- 在
Table或者Form的baseCollection中,設(shè)置parse函數(shù)。(可以把Collection想想成Models) - 在具體的
Collection中設(shè)置地址 - 在事件中,父視圖監(jiān)聽子視圖的模型,一旦發(fā)生
sync,就從新請求一次數(shù)據(jù)。
// 視圖監(jiān)聽其他視圖的模型上數(shù)據(jù)改變
this.listenTo(childModel.model,'change',function(){});
// 視圖監(jiān)聽自己模型上數(shù)據(jù)變化
this.listenTo(this.model,'change',function(){});