2011-04-22 16 views
104
this.model.save({ 
    success: function(model, response){ 
    console.log('success'); 
    }, 
    error: function(){ 
    console.log('error'); 
    } 
}) 

該模型被正確發佈到處理保存的服務器,但成功回調未被觸發。我需要從服務器發回一些東西嗎?如何在model.save()上觸發成功回調?

+7

原來我做錯了: 正確的語法應該是:this.model.save(newItem,{success:...,error:...}) – 2011-04-22 18:10:40

+8

'null'似乎也可以用作佔位符。 – UpTheCreek 2011-09-21 13:22:36

+0

@UpTheCreek謝謝。這有幫助。我查看了源代碼並傳遞了一個空字符串作爲鍵和值。儘管你的方法更好。 – Pramod 2012-09-20 07:33:38

回答

122

保存的第一個參數是保存在模型上的屬性:

this.model.save({att1 : "value"}, {success :handler1, error: handler2}); 
+9

我有點困惑 - (1)我認爲骨幹總是在保存期間發回整個模型(這是不可能的發送部分模型更新)。那麼屬性名稱值的目的是什麼? (2)如果你只是想在執行一些.set()之後保存模型?爲什麼屬性列表? (3)在文檔中,屬性列表參數顯示爲可選。你能澄清嗎?謝謝。 – UpTheCreek 2011-09-21 13:19:43

+7

你可以用你的屬性做一堆「設置」,然後做一個沒有任何屬性的保存。模型的所有屬性始終發送到服務器。保存屬性只是設置+保存的快捷方式。 – Julien 2011-09-23 15:18:11

+0

好的感謝清理我的誤解。 – UpTheCreek 2011-09-23 19:08:45

8

所以我是一個有點困惑 - 我還需要在所有屬性傳遞爲了讓我打電話給一個保存事件?如果我的模型是大..我不希望設置的每種屬性手動

IM調用model.save並試圖做到以下幾點:

this.model.save(
    { 
     success: function (model, response) { 
      console.log('model saved'); 
     } 
    }); 

確定只是回答我的問題櫃面任何人發現這後,我做了以下其中工程:

this.model.save({ id: this.model.get('id') }, 
    { 
     success: function (model, response) { 
      console.log("success"); 
     }, 
     error: function (model, response) { 
      console.log("error"); 
     } 
    }); 

編輯:我不能回答你出於某種原因,但我可以編輯

,但你不必設置ID:this.model.get('id')你可以只通過一個空的對象,因爲一個空白的屬性就不會擴展屬性,什麼也不做:

this.model.save({}, { 
    success: function (model, response) { 
     console.log("success"); 
    }, 
    error: function (model, response) { 
     console.log("error"); 
    } 
}); 
11

您可以使用下劃線LIB作爲爲骨幹已經按照取決於此。請記住,保存的第一個參數必須具有屬性,否則您可能只需傳遞{}以防您希望保存模型本身。

this.model.save({}, _.bind(function(model, response){ 
    //Do whatever you want e.g. 
    this.collection.add(model) 
}, this)) 
+1

this.model(null,[options])仍然可以與Backbone 1.1.0一起使用 – westonplatter 2013-10-24 22:55:49

56

對於一些未知原因,沒有上述方法爲我工作。 api只在我的情況下沒有受到打擊。

但後來當這個搜索,我碰到了this link,其中有人曾試圖null代替{}作爲第一個參數。

this.model.save(null, { 
    success: function (model, response) { 
     console.log("success"); 
    }, 
    error: function (model, response) { 
     console.log("error"); 
    } 
}); 

所以,這爲我工作。希望這也能幫助你。

+3

這是正確的答案如果你傳入null Backbone會發送所有的屬性到服務器保存 – 2013-07-21 22:48:12

+0

奇怪的怪癖,但我選擇的方法。 – 2014-10-05 23:17:54

+0

這對我的用例效果最好。謝謝! – 2014-10-20 20:12:08

4

以下是我用於骨幹模型保存的代碼。

this.model.save(model,{ 
    success:function(model){ 
     console.log("Saved Successfully"); 
    }, 
    error:function(model){ 
     console.log("Error"); 
    } 
}); 

乾杯

羅伊中號Ĵ

+0

它有點分散注意力來傳遞一個本地'model'到'this.model' ..''模型'應該'屬性',這是設置並保存在'this.model'中的所有內容 – Funkodebat 2015-06-08 19:23:56

+0

@Funkodebat:是的。:)我實際上認爲這與正常的jquery-ajax類似,但在Backbone中,第一個參數是模型。不一定要通過它,而是得到相應的一個。這真的很令人不安。:( – 2015-06-09 09:05:25

+0

呃,事實是,不,你在調用save的時候並不傳遞這個模型,save的第一個參數是在調用save之前可以設置的額外屬性,它會像調用'model.set(model.toJSON()); model.save()'。沒有理由將模型設置爲模型設置的模型。在保存模型時,將模型傳遞給它本身就是多餘的縮影。 – Funkodebat 2015-06-09 16:09:51

35

您的服務器必須返回一個JSON對象。如果響應不是JSON對象,則回調將不會觸發。

如果成功您的服務器不返回JSON對象,執行與的dataType保存:「文本」選項,如:

this.model.save([],{ 
dataType:"text", 
success:function() {}, 
error:function() {} 
}); 

使用該選項將不等待JSON作爲迴應,但文本,因此回調將啓動。

+0

神聖的廢話謝謝你。這讓我瘋狂。如果這被記錄在骨幹文檔的某處,會很棒, – 2015-04-16 04:05:22

+0

這節省了我的屁股。 Express 4使用res.json({success:result}),這仍然給我帶來問題。也許我需要做:res.json({「success」:「result」})或其他... – 2015-06-29 19:11:19

1

對於那些想保存模型,沒有更新的屬性,你可以做到以下幾點:

model.once("sync", function(model, response, options){ 
    // 
}); 
model.once("error", function(model, response, options){ 
    // 
}); 
model.save(); 
1

在初始化功能,同步方法綁定到你定義的方法(onSaveSuccess)

  initialize: function (options) { 
        this.model.on('sync', _.bind(this.onSaveSuccess, this)); 
}, 
      onSaveSuccess: function() { 
       console.log('saved'); 
       this.render(); 
      }, 

這樣,你運行this.model.save(任何時候),它將運行onSaveSuccess功能的回調,如果您的同步是成功

相關問題