Backbone.sync nasıl geçersiz kılınır?


145

Backbone.js'yi deniyorum ve denediğim şeylerden biri uzaktaki bir API'ye çağrı yapmak, bu yüzden belgeleri anladığım için Backbone.sync'i geçersiz kılabilmem gerekiyor .

Dokümantasyonun kendisinde bunun nasıl yapılacağına dair bir örnek yok ve Backbone için bir google grubu görünmüyor ... Birisi bunu yapmak için bir örnek verebilir mi?


4
Bir Google Grubu yoksa, freenode'daki #documentcloud odasına göz atmayı ve sorunuzu orada sormayı deneyin. Bir cevap alırsanız buraya geri dönüp kendi sorunuzu cevapladığınızdan emin olun. Orada birçok harika tartışma var ve bunu kodlamak ve sizden sonra gelenler için aranabilir hale getirmek güzel.
Andrew De Andrade

Yanıtlar:


225

Backbone.syncYerel depolama alternatifi ile üzerine yazdıkları bu ek açıklamalı kaynak örneğine bir göz atın

omurga-yerel

Temel olarak Backbone.sync, 4 bağımsız değişken alan bir işlev olmalıdır:

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

Ateşle ya gerek options.successyoksa options.errorbağlı olarak methodbaşarılı oldu. Yöntemler şu formattadır:

  • "create" : modeli sunucuda oluşturmanız bekleniyordu
  • "read" : bu modeli sunucudan okuyup iade etmeniz bekleniyor
  • "update" : sunucudaki modeli bağımsız değişkenle güncellemeniz bekleniyordu
  • "delete" : modeli sunucudan silmeniz bekleniyordu.

Bu 4 yöntemi uygulamanız ve sizin için ne istediğinizi tanımlamanız gerekir. "server"

Tabii ki bunlar sadece uygulanması Backbone.sync gereken şeyler . Daha fazlasını uygulayabilir methodsve daha fazla paramatöre geri dönebilirsiniz, successancak en iyisi bunu yapmamaktır.

Backbone.syncŞu anda olduğu gibi aynı şeyi yaptığından emin olmak en iyisidir, böylece programlamanızın bir uygulama yerine bir arayüze yapılmasıdır. Değiştirilmiş Backbone.syncolanınızı örneğin localStorage için değiştirmek isterseniz, genişletilmiş Backbone.sync ile eşleşecek şekilde genişletmeniz gerekmez "

[Düzenle]

Ayrıca, birden çok uygulamayı kullanabileceğinizi unutmayın sync. İçin yapılan her referans Backbone.syncgerçektir, (this.sync || Backbone.sync)bu nedenle aşağıdaki gibi bir şey yapmanız gerekir:

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

    "sync": myOwnSpecificSync,

    ...
});

Backbone.syncmodellerin syncözel olarak ayarlanmış bir yöntemi olmadıkça tüm modellerin kullandığı varsayılan global olanıdır .


2
Ya bir modelin localStorage'dan alınmasını istersem, başka bir modelin sunucudan alınmasını istersem? Bu mümkün mü?
picardo

19
(this.sync || Backbone.sync)Düzenlemeye bakın. Bir başka ipucu da omurganın açıklamalı kaynağını okumaktır. Hepsi orada!
Raynos

3
Her modelin kendi senkronizasyonuna sahip olmasıyla ilgili [Düzenle] 'den sonraki ayrıntılar çok önemlidir! Teşekkürler!
Abel

26
Belirli bir modelin senkronizasyon yöntemini geçersiz kılabileceğiniz gerçeğinden bahsettiği için +1.
Chetan

12
Sadece bir ekleme: syncKodunuzun herhangi bir yerinden "varsayılan" ı çağırmak istiyorsanız (tipik olarak aşırı yüklenmiş sync), sadece bir Backbone.sync.call(this, method, this, options).
asimetrik

15

Bu cevabın biraz geç olduğunu biliyorum ve @Raynos'un cevabı harika, ama ben biraz farklı yaptım ve belki sizin için veya Backbone ile API kullanmaya çalışan herhangi bir kişi için faydalı olabilir.

Backbone.sync'i geçersiz kılmak yerine Backbone.ajax'ı geçersiz kıldım , çünkü ajax isteğinin yapıldığı yer orası.

İşte bir örnek:

// 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

syncYalnızca belirli öznitelikleri senkronize etmem gerektiğinde, genellikle omurganın yöntemini geçersiz kılmam gerekir. Tipik bir uygulama şuna benzer:

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

ve bu Model veya Koleksiyona gider.
Gabe Gökkuşağı

3
Küçük öneri: bu son satırı olarak değiştirmeye ne dersiniz Backbone.sync.apply(this, arguments);? Örneğin, öğesinin geçersiz kılınan sürümünde "seçenekler" argümanını dışarıda bırakmaya karar verirseniz biraz daha esnektir sync.
Lochlan

Bu sorunun gelecekteki bulucuları için başka bir şey: Backbone.sync a la backbonejs.org/docs/backbone.html#section-62
Lochlan

1
Backbone.model.save(attributes, {patch: true})Şimdi kısmi güncellemeler yapmak için kullanabilirsiniz
roborourke
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.