Saya punya pertanyaan sederhana tentang get dan set fungsi Backbone.js .
1) Dengan kode di bawah ini, bagaimana saya bisa 'mendapatkan' atau 'menyetel' obj1.myAttribute1 secara langsung?
Pertanyaan lain:
2) Dalam Model, selain dari objek default , di mana saya dapat / harus mendeklarasikan atribut lain dari model saya, sehingga atribut tersebut dapat diakses melalui metode get dan set Backbone?
var MyModel = Backbone.Model.extend({
defaults: {
obj1 : {
"myAttribute1" : false,
"myAttribute2" : true,
}
}
})
var MyView = Backbone.View.extend({
myFunc: function(){
console.log(this.model.get("obj1"));
//returns the obj1 object
//but how do I get obj1.myAttribute1 directly so that it returns false?
}
});
Saya tahu saya bisa melakukan:
this.model.get("obj1").myAttribute1;
tetapi apakah itu praktik yang baik?
javascript
backbone.js
backbone-model
keberuntungan
sumber
sumber
defaults
(obj1 dalam kasus ini), objek yang sama itu akan dibagikan di semua contoh model. Praktik saat ini adalah mendefinisikandefaults
sebagai fungsi yang mengembalikan objek untuk digunakan sebagai default. backbonejs.org/#Model-defaults (lihat catatan miring)Jawaban:
Meskipun
this.model.get("obj1").myAttribute1
baik-baik saja, ini sedikit bermasalah karena Anda mungkin tergoda untuk melakukan hal yang sama untuk set, yaituTetapi jika Anda melakukan ini, Anda tidak akan mendapatkan manfaat dari model Backbone
myAttribute1
, seperti peristiwa perubahan atau validasi.Solusi yang lebih baik adalah dengan tidak pernah menumpuk POJSO ("objek JavaScript lama biasa") di model Anda, dan sebagai gantinya menumpuk kelas model khusus. Jadi akan terlihat seperti ini:
Maka kode aksesnya adalah
tetapi yang lebih penting adalah kode pengaturannya
yang akan mengaktifkan peristiwa perubahan yang sesuai dan sejenisnya. Contoh kerja di sini: http://jsfiddle.net/g3U7j/
sumber
Uncaught TypeError: Object #<Object> has no method 'set'
Backbone.Model
, dan kemudian mulai melakukan gelembung peristiwa magis.Saya membuat backbone-deep-model untuk ini - cukup perpanjang Backbone.DeepModel daripada Backbone.Model dan Anda kemudian dapat menggunakan jalur untuk mendapatkan / mengatur atribut model bersarang. Ia juga mempertahankan acara perubahan.
sumber
//You can use index notation to fetch from arrays console.log(model.get('otherSpies.0.name')) //'Lana'
Solusi Domenic akan berfungsi, namun setiap MyModel baru akan mengarah ke instance Obj yang sama. Untuk menghindari ini, MyModel akan terlihat seperti:
Lihat jawaban c3rin @ https://stackoverflow.com/a/6364480/1072653 untuk penjelasan lengkap.
sumber
Saya menggunakan pendekatan ini.
Jika Anda memiliki model Backbone seperti ini:
Anda dapat menyetel atribut "ab" dengan:
Sekarang model Anda akan memiliki atribut seperti:
dengan peristiwa "ubah" diaktifkan.
sumber
meta2= m.get('x'); meta2.id=110; m.set('x', meta2)
. Ini tidak memicu peristiwa perubahan apa pun untuk saya :(_.clone(m.get('x'))
. terima kasihsetting
dengan objek Andagetting
pada waktu yang ditentukan. Jadi jika Anda tidak mengkloning kedua objek tersebut, maka kedua objek yang dibandingkan akan sama persis pada waktu yang ditentukan.Ada satu solusi yang belum terpikirkan oleh siapa pun yang banyak digunakan. Anda memang tidak dapat menyetel atribut bertingkat secara langsung, kecuali Anda menggunakan pustaka pihak ketiga yang mungkin tidak Anda inginkan. Namun apa yang dapat Anda lakukan adalah membuat tiruan dari kamus asli, menyetel properti bertingkat di sana dan daripada menyetel seluruh kamus itu. Sepotong kue.
sumber
Saya memiliki masalah yang sama dengan @pagewil dan @Benno dengan solusi @ Domenic. Jawaban saya adalah untuk menulis sub-kelas sederhana dari Backbone.Model yang memperbaiki masalah.
Apa yang dilakukan NestedModel untuk Anda adalah memungkinkan ini berfungsi (yang terjadi ketika myModel disetel melalui data JSON):
Mudah untuk membuat daftar model secara otomatis saat menginisialisasi, tetapi solusi ini cukup baik untuk saya.
sumber
Solusi yang diajukan oleh Domenic memiliki beberapa kekurangan. Katakanlah Anda ingin mendengarkan acara 'ubah'. Dalam hal ini, metode 'inisialisasi' tidak akan diaktifkan dan nilai kustom Anda untuk atribut akan diganti dengan objek json dari server. Dalam proyek saya, saya menghadapi masalah ini. Solusi saya untuk mengganti metode 'set' Model:
sumber
Meskipun dalam beberapa kasus menggunakan model Backbone daripada atribut Objek bersarang masuk akal seperti yang disebutkan Domenic, dalam kasus yang lebih sederhana Anda dapat membuat fungsi penyetel dalam model:
sumber
Jika Anda berinteraksi dengan backend, yang membutuhkan objek dengan struktur bersarang. Tetapi dengan backbone lebih mudah untuk bekerja dengan struktur linier.
backbone.linear dapat membantu Anda.
sumber