2012-07-31 17 views
7

我想將更改後的模型保存到數據庫(之前設置)。如果保存成功重定向到另一個頁面(例如,可以是任何其他操作)。如何使用backbone.js保存而不指定哪些屬性,但使用回調

Model.save可以有兩個可選屬性。首先是屬性的散列,第二個是選項(如成功和錯誤回調)。 http://backbonejs.org/#Model-save

somemodel.set({foo: 'bar'}); 
//lots of other logic and misc steps the user has to do 
somemodel.save(); //on success should go here 

由於屬性已設置,我只需要回調。

在過去我所做的:

somemodel.save(somemodel.toJSON(), { 
    success: function() { 
     //other stuff 
    } 
); 

或再次通過值保存方法

somemodel.save(
    { foo: this.$('input').val()}, 
    { success: function(){} 
); 

我正在尋找一種方式來清理它。這些文件表明,如果有新的屬性,模型將觸發更改狀態。但是我仍然想重定向用戶(節省新內容或舊/未改變)。

這不存在:

somemodel.on('success', function(){}); 

而這,僅僅是爲驗證:

if(somemodel.save()) { //action } 

也 「同步」 是錯誤的情況下(因爲它同樣適用於摧毀)

有什麼幫助嗎?

回答

12
somemodel.save(
    {}, // or null 
    { 
      success: function(){} 
    } 
); 

將允許您保存具有特定回調的模型而不修改現有密鑰。

並有小提琴http://jsfiddle.net/h5ncaayu/

爲了避免傳球成功回調作爲一個選項,你可以

  • 使用承諾通過save返回:

    somemodel.save().then(...youcallback...) 
    
  • 或使用事件:

    somemodel.on('sync', ...youcallback...); 
    somemodel.save(); 
    
+0

謝謝,這肯定是比我有更好的。爲了不好,它仍然感覺有點髒(提供參數,只是爲了提供一個參數)。也許我應該深入研究並覆蓋/擴展Backbone.sync以回饋「成功」和「錯誤」事件。奇怪的是,它默認是這樣做的,因爲主幹與事件與回調鬆散耦合很多。 – Jareish 2012-07-31 17:31:14

+1

{}和null在此上下文中不相同。{}意味着向服務器發送一個空對象,而null意味着你沒有傳入任何對象來保存(),並且save()應該發送對象的屬性。 – jerzy 2015-01-25 04:20:15

+0

@jerzy這是不正確的,請檢查'model.save'上的Backbone doc:如果您未通過'patch:true'選項,則將資源的完整表示發送到服務器http://backbonejs.org/#模型保存。 {}和null將具有相同的行爲 – nikoshr 2015-01-25 12:15:02

3

Backbone.Model有一個非常方便的方法,名爲「changedAttributes」,它將返回您可以傳遞保存的已更改屬性的散列。所以......

model.save(
    model.changedAttributes(), 
    { 
     success : _.bind(function() {...},this), //_.bind() will give scope to current "this" 
     error : _.bind(function() {...},this); 
    } 
); 

尼斯和整齊...

+0

也很好,肯定會很方便,但我更喜歡其他解決方案,我認爲(更少的代碼)。儘管這個綁定很好的解決方案!我總是將它存儲在另一個變量中,以便在成功/錯誤回調中訪問,但這種感覺更強大。 – Jareish 2012-08-01 07:27:17

+0

值得一提的是,這種方法不會在更改事件之外報告更改的屬性,因此可能changedAttributes()將返回false而不是實際更改的屬性。只是要記住。 – 2012-12-28 00:35:24

相關問題