2011-02-23 109 views
146

我嘗試Backbone.js的,和的事情我想一個是做一個遠程API的調用,所以我需要能夠覆蓋Backbone.sync,據我所知the documentation如何覆蓋Backbone.sync?

沒有如何做到這一點的文檔本身的例子,似乎沒有成爲谷歌組骨幹...可有人指出,這樣做的一個例子嗎?

+4

在沒有谷歌集團,試圖檢查出freenode上的#documentcloud房間,問你的問題在那裏。如果你得到答案,請務必回到這裏回答你自己的問題。在那裏有很多很棒的討論,並且很好地將它編碼並使其可以被搜索到。 – 2011-02-23 22:06:25

+3

供參考:http://groups.google.com/group/backbonejs – 2011-09-21 08:11:31

回答

225

看看這個註釋的源代碼示例,其中它們將覆蓋Backbone.sync有localStorage的替代

backbone-localStorage

基本上Backbone.sync應該是一個函數,有4個參數:

Backbone.sync = function(method, model, options) { }; 

你需要火取決於method是否成功或者options.successoptions.error。該方法的格式爲:

  • "create":預計,你在服務器上創建的模型
  • "read":預計你從服務器讀取這個模型,並將其返回
  • "update":預計更新與參數
  • "delete"服務器上的模型:預計你從服務器上刪除的模型。

您需要實現這4個方法,並定義任何你想爲你的"server"

當然這些都只是Backbone.sync必須實現的事情。您可以實施更多methods,您可能會將更多參數傳遞迴success,但最好不要這樣做。

這是最好的,以確保它一樣Backbone.sync目前這樣做,你的編程接口而不是實現。如果你想轉出修改後的Backbone.sync的說localStorage的一個你不會有自己擴展它來匹配您的擴展Backbone.sync」

[編輯]

也不要注意,你可以使用sync多個實現Backbone.sync每個引用actaully (this.sync || Backbone.sync)那麼你就必須這樣做。

var MyModel = Backbone.Model.extend({ 
    ... 

    "sync": myOwnSpecificSync, 

    ... 
}); 

Backbone.sync只是默認的全局的所有機型使用,除非日e型號具有專門設置的sync方法。

+2

如果我想要一個模型從localStorage中獲取,而另一個從服務器獲取則會怎樣?這可能嗎? – picardo 2011-02-23 20:43:30

+19

'(this.sync || Backbone.sync)'請參閱編輯。進一步的技巧是閱讀骨幹的註釋源。它在那裏! – Raynos 2011-02-23 20:46:33

+0

太棒了。非常感謝。 – picardo 2011-02-23 21:08:04

15

我知道這個答案有點太晚了,@Raynos的答案很好,但我做了一點不同,也許它對你或任何其他試圖使用API​​的人有用骨幹。

而是覆蓋Backbone.sync的,我overrided Backbone.ajax,因爲它是Ajax請求時,其中。

下面是一個例子:

// Set the default implementation of `Backbone.ajax` to proxy through to `$`. 
Backbone.ajax = function() { 
    var args = Array.prototype.slice.call(arguments, 0); 

    // Here, I add the OAuth token (or any other token) 
    // But before, I check that data exists, if not I add it 
    if (args[0]['data'] === undefined) { 
     args[0]['data'] = {}; 
    } 
    args[0]['data']['token'] = 'any_api_token_here'; 

    return Backbone.$.ajax.apply(Backbone.$, args); 
}; 
11

我通常需要重寫骨幹sync方法時,我只需要同步的某些屬性。一個典型的實現是這樣的:

sync: function (method, model, options) { 
    options.data = _.pick(this.attributes, 'foo', 'bar', 'baz'); 
    return Backbone.sync.call(this, method, model, options); 
} 
+0

,並進入模型或集合。 – 2013-09-19 00:01:30

+2

小提示:如何將最後一行改爲'Backbone.sync.apply(this,arguments);'?例如,如果您決定在「sync」的替代版本中省略「選項」參數,它會稍微靈活一點。 – Lochlan 2015-09-17 22:40:07

+0

這個問題的未來發現者還有其他一些東西:_make肯定會返回Backbone.sync_ a la http://backbonejs.org/docs/backbone.html#section-62 – Lochlan 2015-09-18 00:59:06