Bagaimana cara mengganti Backbone.sync?

145

Saya mencoba Backbone.js, dan salah satu hal yang saya coba adalah membuat panggilan ke API jarak jauh, jadi saya harus dapat mengesampingkan Backbone.sync, karena saya memahami dokumentasi .

Tidak ada contoh bagaimana melakukannya dalam dokumentasi itu sendiri, dan tampaknya tidak ada grup google untuk Backbone ... bisakah seseorang menunjukkan contoh untuk melakukan ini?

picardo
sumber
4
Dengan tidak adanya Grup Google, coba periksa ruang #documentcloud di freenode dan ajukan pertanyaan Anda di sana. Pastikan untuk kembali ke sini dan menjawab pertanyaan Anda sendiri jika Anda mendapat jawaban. Ada banyak diskusi hebat di sana dan menyenangkan untuk mengkodifikasinya dan membuatnya dapat dicari oleh orang-orang yang datang setelah Anda.
Andrew De Andrade
3
FYI: groups.google.com/group/backbonejs
Drew Dara-Abrams

Jawaban:

225

Lihatlah contoh sumber beranotasi ini di mana mereka menimpa Backbone.syncdengan alternatif penyimpanan lokal

backbone-localStorage

Pada dasarnya Backbone.sync adalah fungsi yang membutuhkan 4 argumen:

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

Anda perlu memecat salah satu options.successatau options.errortergantung pada apakah methodberhasil. Metode dalam format:

  • "create" : diharapkan Anda membuat model di server
  • "read" : diharapkan Anda membaca model ini dari server dan mengembalikannya
  • "update" : diharapkan Anda memperbarui model di server dengan argumen
  • "delete" : diharapkan Anda menghapus model dari server.

Anda perlu menerapkan 4 metode dan menentukan apa pun yang Anda inginkan untuk Anda "server"

Tentu ini hanya hal-hal yang Backbone.sync harus diimplementasikan. Anda dapat menerapkan lebih banyak methodsdan Anda dapat memberikan lebih banyak paramater kembali successtetapi yang terbaik adalah tidak melakukannya.

Yang terbaik untuk memastikan itu melakukan hal yang sama seperti yang Backbone.syncdilakukan saat ini sehingga pemrograman Anda ke antarmuka daripada implementasi. Jika Anda ingin mengganti yang dimodifikasi Backbone.syncuntuk mengatakan penyimpanan lokal, Anda tidak perlu memperpanjang sendiri untuk mencocokkan Backbone Anda yang diperluas. "

[Sunting]

Perhatikan juga bahwa Anda dapat menggunakan beberapa implementasi dari sync. Setiap referensi untuk Backbone.syncactaully (this.sync || Backbone.sync)sehingga Anda hanya perlu melakukan sesuatu seperti:

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

    "sync": myOwnSpecificSync,

    ...
});

Backbone.synchanyalah standar global yang digunakan semua model kecuali model memiliki syncmetode yang ditetapkan secara khusus.

Raynos
sumber
2
Bagaimana jika saya ingin model mengambil dari localStorage, sementara yang lain mengambil dari server? Apakah itu mungkin?
picardo
19
(this.sync || Backbone.sync)Lihat edit. Kiat selanjutnya adalah membaca sumber tulang punggung beranotasi. Semuanya ada di sana!
Raynos
3
Detail setelah [Sunting] tentang setiap model yang memiliki sinkronisasi sendiri sangat penting! Terima kasih!
Abel
26
+1 untuk menyebutkan fakta bahwa Anda dapat mengganti metode sinkronisasi model tertentu.
Chetan
12
Hanya satu tambahan: jika Anda ingin memanggil "default" syncdari mana saja dalam kode Anda (biasanya overrydden sync), lakukan saja Backbone.sync.call(this, method, this, options).
asimetris
15

Saya tahu jawaban ini agak terlambat, dan jawaban dari @Raynos hebat, tapi saya melakukannya sedikit berbeda, dan mungkin itu akan berguna bagi Anda atau orang lain yang mencoba menggunakan API dengan Backbone.

Alih-alih mengesampingkan Backbone.sync, saya mengesampingkan Backbone.ajax , karena di situlah permintaan ajax dibuat.

Ini sebuah contoh:

// 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);
};
Cyril N.
sumber
11

Saya biasanya perlu mengganti syncmetode backbone ketika saya hanya perlu menyinkronkan atribut tertentu. Implementasi yang khas terlihat seperti ini:

sync: function (method, model, options) {
  options.data = _.pick(this.attributes, 'foo', 'bar', 'baz');
  return Backbone.sync.call(this, method, model, options);
}
Jesse Atkinson
sumber
dan itu masuk ke Model atau Koleksi.
Gabe Rainbow
3
Saran kecil: bagaimana dengan mengubah baris terakhir ke Backbone.sync.apply(this, arguments);? Ini sedikit lebih fleksibel jika Anda, misalnya, memutuskan untuk tidak menggunakan argumen "opsi" dalam versi yang diganti sync.
Lochlan
Sesuatu yang lain untuk para pencari masa depan dari pertanyaan ini: pastikan untuk mengembalikan Backbone.sync a la backbonejs.org/docs/backbone.html#section-62
Lochlan
1
Anda dapat menggunakan Backbone.model.save(attributes, {patch: true})untuk melakukan pembaruan parsial sekarang
roborourke