Kesalahan konektor backbone-couchdb: properti atau fungsi url harus ditentukan

Saya baru saja mulai bekerja dengan backbone.js dan couchdb menggunakan aplikasi 'penghitung' sederhana untuk mempelajari seluk beluknya. Versi yang menggunakan penyimpanan lokal dapat ditemukan di sini: demo biola. Ini adalah aplikasi sederhana yang menampilkan penghitung yang dapat ditambah dan dikurangi. Nilai penghitung disimpan dalam database. Dalam versi referensi, saya menggunakan penyimpanan lokal, yang tampaknya berfungsi dengan baik.

Masalah muncul ketika saya mengonversi contoh saya untuk menggunakan couchdb. Oleh karena itu, saya membuat couchapp dan mengadaptasi kodenya agar berfungsi dengan konektor backbone-couchdb. Saya juga menyertakan atribut konfigurasi db (seperti yang disebutkan di sini ). Bagian kode yang relevan (diadaptasi) ditemukan di bawah (yang intinya menyertakan atribut url).

var Counter = Backbone.Model.extend({

  defaults: {
    countervalue: 0
  },

  initialize: function() {
     _.bindAll(this);
  },

  increment: function() {
     this.save({countervalue: this.get('countervalue') + 1});
  },

  decrement: function() {
     this.save({countervalue: this.get('countervalue') - 1});
  }
});

var Counters = Backbone.Collection.extend({

 model: Counter,

 url : "counters",

 initialize: function() {
    this.fetch();
 }
});

Namun, setiap kali saya menambah atau mengurangi penghitung, kesalahan berikut muncul: "Properti atau fungsi "url" harus ditentukan". Dari dokumentasinya, saya memahami bahwa Model mendapatkan urlnya dari Koleksi yang memuatnya. Tampaknya bukan itu masalahnya? Apa yang saya lakukan salah?

Mungkin bagian lain yang relevan dari aplikasi ini adalah tempat saya membuat instance model Counter (dapat juga dilihat di demo biola); metode inisialisasi AppView:

    initialize: function() {
        var currentCounter;
        if (theCounters.size() > 0) currentCounter = theCounters.last();
        else {
            currentCounter = new Counter();
            theCounters.push(currentCounter);
        }
        this.counterview = new CounterView({
            model: currentCounter
        });
    }

person Johan B    schedule 25.12.2012    source sumber


Jawaban (1)


Saya belum pernah bekerja dengan CouchDB dan Backbone.js secara bersamaan, tapi saya rasa solusinya sama dengan penjelasan ini.

Saat menggunakan adaptor localStorage, Anda harus menyediakan atribut localStorage pada Koleksi dan itulah satu-satunya tempat di mana Anda mengetikkan URL (sebenarnya, URL root untuk Koleksi). Namun, ketika tidak menggunakan adaptor ini dan mencoba menyinkronkan model, model ini memerlukan URL karena sekarang Koleksi tidak memilikinya. Anda benar saat memberikan properti URL ke Koleksi, namun properti tersebut digunakan saat menyinkronkan seluruh Koleksi dan bukan saat menyinkronkan model individual.

Untuk membuatnya berfungsi, Anda dapat memberikan URL untuk model (ingat itu bisa berupa fungsi dan bukan hanya sebuah String) atau Anda dapat menggunakan atribut urlRoot, dan urlRoot itulah yang kita pahami sebagai "URL Koleksi" (di mana itu akan menambahkan id). Jika urlRoot adalah /counters dan Anda memiliki model dengan id dari 1, maka URL final (yang melakukannya untuk Anda) adalah /counters/1, misalnya.

Sunting:

Anda dapat memeriksa pertanyaan ini jika Anda tidak melakukannya, meskipun ini bukan tentang CouchDB, tetapi ini mungkin dapat menjelaskan masalahnya: Bagaimana cara mengambil satu model di Backbone?

person Meta    schedule 25.12.2012
comment
Terimakasih atas tanggapan Anda. Menambahkan properti urlRoot akan memperbaiki kesalahan tetapi tampaknya tidak memperbaiki perilakunya (yaitu saya tidak mendapatkan model yang bertahan saat memulai ulang aplikasi -- tetapi ini mungkin disebabkan oleh hal lain juga). Bagaimanapun, saya sangat bingung dengan apa yang Anda sebutkan tentang properti url karena tampaknya bertentangan dengan dokumen: documentcloud.github.com/backbone/#Model-url atau bukan? terima kasih untuk klarifikasi lebih lanjut. - person Johan B; 26.12.2012
comment
Dari apa yang saya lihat setelah memeriksa ulang dokumen, Anda benar saat menyetel atribut url dari Koleksi dan berpikir bahwa hanya itu yang Anda perlukan. Namun, dari apa yang saya pahami dan ketahui sejauh ini, atribut tersebut hanya akan berfungsi saat menyinkronkan seluruh Koleksi (yaitu, jika Anda memiliki 3 model dengan 1, 2 dan 3 sebagai id, koleksi akan menyinkronkannya ke root/1, dll). Namun, kode Anda menyimpan model satu per satu, sehingga model tersebut tidak benar-benar mengetahui di koleksi mana model tersebut berada. Itu sebabnya Anda perlu menyediakan url atau urlRoot dalam model. Kurang lebih seperti itulah yang dikatakan dokumen ^^ - person Meta; 26.12.2012