Backbone: idAttribute tidak terdefinisi untuk metode modelId jika model didefinisikan sebagai fungsi.

Dibuat pada 9 Des 2019  ·  10Komentar  ·  Sumber: jashkenas/backbone

duplicate

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

Semua 10 komentar

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 atribut model , tetapi jika Anda telah mendefinisikan fungsi model sebagai metode kelas ES2015 maka tidak memiliki atribut prototype .

Lihat disini:

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
   }
});

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.

image

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat