04Backbone系列

數(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
});
  1. 從Backbone模塊繼承的子類都有靜態(tài)屬性__super__,靜態(tài)屬性和靜態(tài)方法就是不用創(chuàng)建實(shí)例就可以使用的方法

初始化和讀取數(shù)據(jù)

  1. 通過new初始化數(shù)據(jù)
  2. 通過以下方法讀取數(shù)據(jù)
  • modelInstance.get()
  • modelInstance.escape()防XXS攻擊
  • modelInstance.previous()獲取模型改變之前的數(shù)據(jù),××但是××只能在change事件和屬性事件中使用
  1. 所有的數(shù)據(jù)存儲在modelInstance.attributes中,但是不建議用它獲取數(shù)據(jù)和改變數(shù)據(jù)
  • model.previousAttributes()使用場景和previous相同

修改數(shù)據(jù)

  1. modelInstance.set()
  2. 當(dāng)修改數(shù)據(jù)時,會出發(fā)change事件。通過modelInstance對事件的監(jiān)聽,作出響應(yīng)
  3. 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)證

  1. 數(shù)據(jù)驗(yàn)證對應(yīng)有error方法,modelInstance.on('error',function(){})
  2. modelInstance.set可以添加對象,設(shè)置該對象的silent選項(xiàng),本次不會進(jìn)行validate檢驗(yàn),但是下次set并且沒有silent時,還是會觸發(fā)。同時,當(dāng)本次設(shè)置出錯時,不會報(bào)錯,不會出發(fā)change事件
  3. modelInstance.set可以添加對象,設(shè)置該對象的error選項(xiàng)。優(yōu)先于error事件
  4. error事件,有兩個參數(shù)modelerror。第一個模型對象,第二個是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

  1. modelInstance.unset(name)
  2. modelInstance.clear()

將模型數(shù)據(jù)同步到服務(wù)器

  1. 數(shù)據(jù)標(biāo)識。模型向服務(wù)器發(fā)送請求,比如修改或者刪除,但是需要帶上model的id。這個是model發(fā)送請求的時候,自動添加的。
  2. 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)先級第一
  1. 數(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/errorchange發(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ù)
  • modelInstance.destroy()
    • 第一個參數(shù),wait選項(xiàng),后臺無響應(yīng)或響應(yīng)出錯,model不會改變
    • 會觸發(fā)destory,request,sync事件。

應(yīng)用

  1. Table或者FormbaseCollection中,設(shè)置parse函數(shù)。(可以把Collection想想成Models)
  2. 在具體的Collection中設(shè)置地址
  3. 在事件中,父視圖監(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(){});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容