Saya tidak mengikuti. bagaimana model didefinisikan sebagai fungsi?
Saya benar-benar mengalami masalah ini (atau yang serupa) kemarin.
Anda dapat menentukan fungsi model pada koleksi untuk pembuatan model polimorfik.
Saat memanggil .add
pada koleksi Anda, kode Backbone mencoba memanggil .prototype.idAttribute
pada atribut model
, tetapi jika Anda telah mendefinisikan fungsi model
sebagai metode kelas ES2015 maka tidak memiliki atribut prototype
.
Lihat di sini: https://github.com/jashkenas/backbone/blob/75e6d0ce6394bd2b809823c7f7dc014ddb6ae287/backbone.js#L1102
Jadi misalnya, ini akan menyebabkan masalah:
const Library = Backbone.Collection.extend({
model () {
// stuff goes here
}
});
Jika Anda menentukannya seperti ini, maka masalahnya akan hilang:
const Library = Backbone.Collection.extend({
model: function () {
// stuff goes here
}
});
Saya benar-benar mengalami masalah ini (atau yang serupa) kemarin.
Anda dapat menentukan fungsi model pada koleksi untuk pembuatan model polimorfik.
Saat memanggil
.add
pada koleksi Anda, kode Backbone mencoba memanggil.prototype.idAttribute
pada atributmodel
, tetapi jika Anda telah mendefinisikan fungsimodel
sebagai metode kelas ES2015 maka tidak memiliki atributprototype
.Lihat disini:
Jadi misalnya, ini akan menyebabkan masalah:
const Library = Backbone.Collection.extend({ model () { // stuff goes here } });
Jika Anda menentukannya seperti ini, maka masalahnya akan hilang:
const Library = Backbone.Collection.extend({ model: function () { // stuff goes here } });
Terima kasih atas deskripsi detail masalah!
Tetapi jawaban Anda tidak menyelesaikan masalah untuk idAttribute.
Pada tambahkan referensi model baru tidak ditambahkan. Oleh karena itu Anda tidak bisa mendapatkan model baru dengan id.
Workarond - menambahkan model.prototype.idAttribute yang sama seperti pada model.
Saya pikir masalahnya adalah model
pada Collection
didefinisikan sebagai: Override this property to specify the model class that the collection contains.
API ini tidak mendukung model yang didefinisikan sebagai fungsi.
@paulfalgout tulang punggung dokumen untuk Collection.model tentukan Anda dapat mengatur fungsi sebagai model
. Bahwa ini tidak mungkin dengan sintaks model ()
(bukan model: function()
) tampak seperti bug bagi saya atau setidaknya sangat membingungkan.
Ya, saya menautkan ke bagian dokumen yang relevan dalam pesan asli saya.
Lihat di sini: https://backbonejs.org/#Collection -model
@PavelKoroteev : Sepertinya masalah kita terkait, tapi tidak sama.
Inilah yang saya bicarakan (ditempelkan dari konsol):
collection = new (Backbone.Collection.extend({ model (attrs, options) { return new (Backbone.Model.extend({ idAttribute: 'customId' }))(attrs, options)}}));
child {length: 0, models: Array(0), _byId: {…}}
collection.add({ customId: 'id.1' });
backbone.js:1102 Uncaught TypeError: Cannot read property 'idAttribute' of undefined
at child.modelId (backbone.js:1102)
at child.get (backbone.js:997)
at child.set (backbone.js:872)
at child.add (backbone.js:814)
at <anonymous>:1:12
Saya pikir masalahnya sebenarnya sama. Dan juga sama seperti https://github.com/jashkenas/backbone/issues/4203
menggunakan model: function(attrs, options)
akan membuat prototipe yang tidak memiliki idAttribute
dan akan kembali ke id
sehingga akan "berfungsi"
Anda benar model polimorfik didokumentasikan. _but_... itu tidak mendukung idAttribute
atau metode tipe es6 karena baris ini dengan model.prototype
cukup lama.
Tampaknya https://github.com/jashkenas/backbone/pull/3966 adalah semacam perbaikan :-/
Melihat PR dari 2016 mendekam dan tidak bergabung (atau ditolak demi sesuatu yang lebih baik) pada dasarnya membuat saya enggan mencoba membuat PR untuk memperbaiki masalah ini.
Dari apa yang saya tahu, Backbone cukup banyak mati.
Seperti yang telah dilakukan orang lain juga, saya telah membuat garpu, milik saya disebut Skeletor , yang akan saya gunakan untuk memperbarui kode Backbone saya ke API dan standar yang lebih modern dan kemudian saya akan secara bertahap beralih ke sesuatu yang lebih baik.
Saya baru saja menggabungkan https://github.com/jashkenas/backbone/pull/3966 PR lama, setelah menyelesaikan konflik. Beri tahu saya jika itu memberi Anda masalah ...
Komentar yang paling membantu
Saya baru saja menggabungkan https://github.com/jashkenas/backbone/pull/3966 PR lama, setelah menyelesaikan konflik. Beri tahu saya jika itu memberi Anda masalah ...