Pertanyaan mengisi koleksi bersarang dengan pengambilan model induk


Saya punya model berikut dengan koleksi bertingkat

var Mdl = Backbone.Model.extend({
  initialize: function() {

    // collection
    this.col1 = new NestedCollection();

  },
  ...
});

Saya ingin mengirim data untuk model dan model dalam koleksi dalam satu permintaan, mencari sesuatu seperti:

{
  att1: val,
  col1: [{obj1: val}, {...}]
}

Saya tidak yakin tentang cara terbaik untuk menyerahkan data dalam permintaan ke koleksi bertingkat (col1). Saya tidak bisa ...

var Mdl = Backbone.Model.extend({
  initialize: function() {
    // collection
    this.col1 = new NestedCollection(this.get('col1');
  },
  ...
});

... karena pada saat menginisialisasi disebut fungsi parsing dari model belum disebut yang berarti bahwa atribut col1 kosong, solusi lain yang saya pikir adalah untuk mendengarkan perubahan dalam model induk seperti ...

model.bind("change:tags", function() {
  model.col1.refresh(model.get('col1'));
});

Namun solusi ini terasa agak berat dan mungkin berpotensi merusak

this.col1.bind("add", function() {})

dan

this.col1.bind("remove", function() {})

mengatur fungsi pada koleksi.

Adakah yang punya ide tentang cara 'resmi' untuk melakukan ini?

Terima kasih.


10
2018-06-09 12:18


asal


Jawaban:


Cara "resmi" adalah mengganti metode parse:

http://documentcloud.github.com/backbone/#Model-parse

Dalam kasus spesifik Anda, apa yang mungkin saya lakukan adalah, dalam metode parse, buat kumpulan bersarang dari data col1, hapus dari hasil, lalu berikan hasil. Backbone kemudian akan mengubah sisa data menjadi properti.

Saya belum mencoba ini, jadi saya tidak yakin 100% berhasil:

parse: function(response) {
  this.col1 = new NestedCollection(response.col1);
  delete response.col1
  return response
}

Edit: 28 Nov 2012

Harm menunjukkan bahwa ini mungkin bukan cara terbaik untuk melakukannya lagi. Jawaban asli ditulis beberapa waktu yang lalu, dan pertanyaan asli menunjukkan bahwa pengguna menginginkan koleksi menjadi properti pada model (bukan atribut), tetapi Harm memiliki titik yang memiliki koleksi sebagai atribut adalah lebih diterima cara melakukannya hari ini.

Hari ini, Anda bisa menggunakan sesuatu seperti Backbone-Relasional untuk menangani banyak hal ini untuk Anda, atau, jika Anda ingin melakukannya sendiri, dan memiliki koleksi sebagai atribut model, Anda dapat melakukan sesuatu seperti:

Building = Backbone.Model.extend({
    parse: function(response) {
        console.log("Parse Called");
        response.rooms = new Rooms(response.rooms);
        return response;
    }
});
Room = Backbone.Model.extend({});
Rooms = Backbone.Collection.extend({
    model: Room
});

science_building = new Building();

science_building.fetch(
    {success: function(model,resp) {console.log(resp);}}
);

Dengan respons pengambilan model seperti:

{ id: 1, 
  name: "Einstein Hall", 
  rooms: [
    {id:101, name:'Chem Lab'},
    {id:201, name:'Physics Lab'},
    {id:205, name:'Bio Lab'}
  ]
}

Menghasilkan model Bangunan yang memungkinkan:

science_building.get('rooms').get(101).get('name')   // ==> "Chem Lab"

Contoh jsFiddle yang berfungsi: http://jsfiddle.net/edwardmsmith/9bksp/


33
2018-06-09 12:35