2012-05-17 84 views

回答

32

從Backbone.js v0.9.9開始,您可以簡單地將{ patch: true }傳遞給save()

瞭解更多:http://backbonejs.org/#changelog

+0

感謝您的更新! – Burnash

+0

'myModel.save(data,{patch:true})'在Chrome的網絡面板中顯示爲使用HTTP方法的「OPTIONS」,這看起來不正確。 – SimplGy

+1

OPTIONS首先作爲PRE-FLIGHT發送。如果通過,則將發送PATCH。 –

8

你必須重寫Backbone.sync並擴展現有的方法映射

var methodMap = { 
    'create': 'POST', 
    'update': 'PUT', 
    'delete': 'DELETE', 
    'read': 'GET', 
    'patch': 'PATCH' 
}; 

你必須在模型上創建自己的打補丁方法類似

Backbone.Model.prototype.patch = function(options) 
{ 
    // some code here that checks what attributes have changed since last save 
    var xhr = (this.sync || Backbone.sync).call(this, 'patch', this, options); 
    return xhr; 
} 

我相信你可以擴展主幹進一步包括OPTIONSHEAD如果您需要

請注意,即使通過jQuery支持PATCH,OPTIONS和HEAD方法,您的最終用戶的瀏覽器可能不會。

8

除了James Cropchos answer我想補充以下,因爲this steals some hours從我也許可以幫助別人:

如果你使用model.save(attributesToPatchObject,{patch: true})喜歡它是可能的,因爲骨幹v.0.9。 9如James Cropchos的回答中所述,您可能想知道如何確定自上次調用model.save()以來哪些屬性已被更改爲attributesToPatchObject,這是model.save()的第一個參數(如果最近未保存模型,則爲model.fetch()) 。

骨幹本身並沒有跟蹤這些屬性。我想model.changedAttributes()可能適合的方法,但隨着backbone-doc says此方法返回

自上次 組已經改變只有模型的屬性的哈希值,或假,如果有沒有

所以這種方法不適合這種需要。經過一番研究,我發現骨幹本身並沒有跟蹤未保存的屬性(我知道,如果我已經仔細閱讀了文檔,這不是一個很好的發現)。

我發現backbone.trackit是一個主幹插件,通過將unsavedAttributes()方法添加到模型中,它完全可以將所需的功能添加到主幹。 backbone.trackit的文檔說,這個方法:

對稱骨幹model.changedAttributes(),但它返回已經改變了自上次保存模型的屬性的哈希值,或假,如果有沒有。像changedAttributes一樣,可以傳入一個外部屬性哈希,返回該哈希中與模型不同的屬性。

它的工作原理是這樣的:

//fetch an existing model from server 
model.fetch({ 
    success : function(model, respose, options) { 
    //tell backbone.trackit to track unsaved Attributes 
    model.startTracking(); 
    } 
}); 

//now some changes to the model happen 
model.set("someProperty", "someValue"); 

/* save the model to server using the PATCH-Method 
    and only send the unsaved Attributes; 
    in this case only "someProperty" is sent 
*/ 
model.save(model.unsavedAttributes(), {patch: true}); 

由於unsavedAttributes()回報如果沒有未保存的屬性,你可以額外用來檢查是否unsavedAttributes()回報什麼的,如果條件內包裝您save()聲明然後false,並且只在需要的時候執行PATCH-Request(因爲更改了某些內容)。

注意:您沒有打電話fetch()使用startTracking(),因此您可以使用此方法,即使新創建的模型(在該模型model.isNew()返回true),如果對於一個用例。

希望這可以爲某人節省一點研究時間。