Saya mendapatkan JSON berikut yang disediakan dari server. Dengan ini, saya ingin membuat model dengan model bersarang. Saya tidak yakin yang mana cara untuk mencapai ini.
//json
[{
name : "example",
layout : {
x : 100,
y : 100,
}
}]
Saya ingin ini diubah menjadi dua model tulang punggung bersarang dengan struktur berikut:
// structure
Image
Layout
...
Jadi saya mendefinisikan model Layout seperti ini:
var Layout = Backbone.Model.extend({});
Tapi manakah dari dua teknik (jika ada) di bawah ini yang harus saya gunakan untuk menentukan model Image? A atau B di bawah?
SEBUAH
var Image = Backbone.Model.extend({
initialize: function() {
this.set({ 'layout' : new Layout(this.get('layout')) })
}
});
atau, B
var Image = Backbone.Model.extend({
initialize: function() {
this.layout = new Layout( this.get('layout') );
}
});
define(['modelFile'], function(MyModel){... do something with MyModel})
Tapi Anda benar. Saya membiasakan diri untuk mereferensikan model dengan konvensi yang Anda sarankan.Backbone.Model.prototype.parse
fungsi. Kemudian, semua model Anda harus lakukan adalah menentukan jenis objek submodel (dalam atribut "model" Anda).Saya memposting kode ini sebagai contoh saran Peter Lyon untuk mendefinisikan ulang parse. Saya memiliki pertanyaan yang sama dan ini berhasil untuk saya (dengan backend Rails). Kode ini ditulis dalam Coffeescript. Saya membuat beberapa hal eksplisit untuk orang yang tidak terbiasa dengannya.
atau, di JS
sumber
Gunakan
Backbone.AssociatedModel
dari Backbone-association :sumber
Saya tidak yakin Backbone sendiri memiliki cara yang direkomendasikan untuk melakukan ini. Apakah objek Layout memiliki ID dan rekamannya sendiri di database back end? Jika demikian Anda dapat membuatnya Model sendiri seperti yang Anda miliki. Jika tidak, Anda bisa membiarkannya sebagai dokumen bersarang, pastikan Anda mengonversinya ke dan dari JSON dengan benar di metode
save
danparse
. Jika Anda akhirnya mengambil pendekatan seperti ini, saya pikir contoh A Anda lebih konsisten dengan tulang punggung karenaset
akan diperbarui dengan benarattributes
, tetapi sekali lagi saya tidak yakin apa yang dilakukan Backbone dengan model bersarang secara default. Sepertinya Anda memerlukan beberapa kode khusus untuk menangani ini.sumber
new
operatornya hilang . Saya telah mengeditnya untuk memperbaiki kesalahan ini.Saya akan memilih Opsi B jika Anda ingin membuat semuanya tetap sederhana.
Pilihan bagus lainnya adalah menggunakan Backbone-Relational . Anda baru saja mendefinisikan sesuatu seperti:
sumber
Saya menggunakan plugin Backbone DeepModel untuk model dan atribut bersarang.
https://github.com/powmedia/backbone-deep-model
Anda dapat mengikat untuk mengubah level n acara secara mendalam. sebagai contoh:
model.on('change:example.nestedmodel.attribute', this.myFunction);
sumber
Versi CoffeeScript dari jawaban indah rycfung :
Bukankah itu manis? ;)
sumber
Saya memiliki masalah yang sama dan saya telah bereksperimen dengan kode dalam jawaban rycfung , yang merupakan saran yang bagus.
Namun, jika Anda tidak ingin
set
model bersarang langsung, atau tidak ingin terus-menerus lulus{parse: true}
dalamoptions
, pendekatan lain akan mendefinisikan kembaliset
itu sendiri.Dalam Backbone 1.0.0 ,
set
yang disebut dalamconstructor
,unset
,clear
,fetch
dansave
.Pertimbangkan model super berikut , untuk semua model yang membutuhkan model bersarang dan / atau koleksi.
Perhatikan bahwa
model
,_setModel
dan_unsetModel
sengaja dikosongkan. Pada level abstraksi ini, Anda mungkin tidak dapat menentukan tindakan yang wajar untuk callback. Namun, Anda mungkin ingin menimpanya di submodel yang diperluasCompoundModel
.Callback tersebut berguna, misalnya, untuk mengikat listener dan menyebarkan
change
peristiwa.Contoh:
Dengan ini, Anda memiliki pembuatan model bertingkat otomatis dan penyebaran peristiwa. Penggunaan sampel juga disediakan dan diuji:
Keluaran:
sumber
Saya menyadari saya terlambat ke pesta ini, tetapi kami baru-baru ini merilis plugin untuk menangani skenario ini dengan tepat. Ini disebut backbone-nestify .
Jadi model bertingkat Anda tetap tidak berubah:
var Layout = Backbone.Model.extend({...});
Kemudian gunakan plugin saat menentukan model yang memuat (menggunakan Underscore.extend ):
Setelah itu, dengan asumsi Anda memiliki model
m
yang merupakan turunan dariImage
, dan Anda telah menyetel JSON dari pertanyaanm
, Anda dapat melakukan:sumber
Gunakan bentuk tulang punggung
Ini mendukung formulir, model, dan toJSON bersarang. SEMUA BERLARANG
sumber
Jika Anda tidak ingin menambahkan belum kerangka lain, Anda mungkin mempertimbangkan untuk membuat kelas dasar dengan ditimpa
set
dantoJSON
dan menggunakannya seperti ini:Anda akan membutuhkan
BaseModel
jawaban ini (tersedia, jika Anda suka, sebagai intinya ).sumber
Kami juga mengalami masalah ini dan pekerja tim telah mengimplementasikan plugin bernama backbone-nested-atribut.
Penggunaannya sangat sederhana. Contoh:
Dengan ini, model Pohon dapat mengakses buah-buahan:
Anda dapat melihat lebih banyak informasi di sini:
https://github.com/dtmtec/backbone-nested-attributes
sumber