Backbone: Atribut tampilan khusus dibagikan di antara berbagai contoh

Dibuat pada 19 Apr 2012  ·  9Komentar  ·  Sumber: jashkenas/backbone

Silakan lihat biola ini: http://jsfiddle.net/XgPyH/31/

Jadi kami membuat 10 instance itemView dan memanggil metode addItem untuk menambahkan 10 item ke setiap itemView. Setiap itemView harus memiliki 10 item di properti itemArray mereka. Namun sebaliknya, mereka membagikan properti itemArray dan memiliki 100 item di dalamnya.

Masalahnya mungkin backbone.view tidak mengatur ulang atribut kustom di konstruktor.

question

Komentar yang paling membantu

Ya, karena itemArray adalah properti dari prototipe itemView , properti itu dipakai bersama oleh semua contoh itemView . Jika Anda ingin instance memiliki itemArray Anda harus menyetelnya di initialize atau di konstruktor.

var ItemView = Backbone.View.extend({

  initialize: function() {
    this.itemArray = [];
  },

  ...

});

Semua 9 komentar

Ya, karena itemArray adalah properti dari prototipe itemView , properti itu dipakai bersama oleh semua contoh itemView . Jika Anda ingin instance memiliki itemArray Anda harus menyetelnya di initialize atau di konstruktor.

var ItemView = Backbone.View.extend({

  initialize: function() {
    this.itemArray = [];
  },

  ...

});

Berikut biola yang melakukan apa yang Anda gambarkan: http://jsfiddle.net/XgPyH/32/

Hai @braddd ,

Kami telah menggunakan solusi yang sama dengan yang Anda posting sebagai solusi, namun sepertinya kami tidak perlu melakukan itu. Perilaku yang cukup membingungkan, bukan?

Bisakah Anda menjelaskan apa gunanya memiliki itu pada prototipe (saya tidak begitu mengerti, saya tidak mengatakan implementasi saat ini salah - hanya mencoba mendapatkan beberapa klarifikasi sehingga kami dapat memahami).

Kami sering menetapkan semua properti tampilan kami dengan cara yang digunakan @spawnedc dalam biolanya, karena kemudian jelas apa properti tampilan tersebut, jika kami kemudian harus "menimpanya" dalam metode inisialisasi juga yang sepertinya tidak praktis .

Dalam aplikasi contoh, properti tampilan ditentukan dengan cara yang persis sama, (lihat Todo.js). variabel "template" ditentukan dengan cara yang sama, tetapi tentu saja karena ini hanya string yang tidak berubah, kami tidak pernah melihat masalah seperti ini.

Apa cara yang benar untuk menentukan properti tampilan dinamis, tentunya bukan kita harus menimpa semuanya dalam metode init ...?

Bisakah Anda menjelaskan apa gunanya memiliki itu pada prototipe

Menempatkan properti yang bisa berubah (array, hashes, dll.) Pada prototipe jarang berguna dalam pengalaman saya (meskipun saya yakin ada beberapa contoh di mana itu).

Apa cara yang benar untuk menentukan properti tampilan dinamis, tentunya bukan kita harus menimpa semuanya dalam metode init ...?

Ya, untuk menyetel properti dengan nilai yang bisa berubah pada setiap instance kelas / konstruktor Anda harus melakukannya di konstruktor (atau dalam kasus ini initialize , yang dipanggil dari konstruktor).

Sebagai contoh, ini adalah cara Backbone menyiapkan properti dalam sebuah instance Backbone.Model .

@braddunbar Jika saya membuat instance _new_, saya mengharapkan _all_ propertinya akan disetel ulang karena ini adalah instance _brand new_ . Bukankah ini perilaku yang diharapkan atau apakah saya melewatkan sesuatu?

Hai @braddd ,

Menempatkan properti yang bisa berubah (array, hashes, dll.) Pada prototipe jarang berguna dalam pengalaman saya (meskipun saya yakin ada beberapa contoh di mana itu).

Bukankah itu yang dilakukan Bacbone dengan itemArray dalam kasus ini? itemArray ada di prototipe, mengapa perilaku yang kita alami terjadi?

Saya 100% setuju dengan pernyataan terakhir @spawnedc . Saya tidak mengharapkan properti apa pun untuk dibagikan di antara instance tampilan "saudara".

Sebenarnya, tidak ada properti yang disetel ulang kecuali jika disetel ulang di konstruktor. Mereka selalu merupakan properti prototipe yang sama yang dimiliki oleh semua instance yang dibuat oleh konstruktor yang sama.

var A = function(){};
var a = new A();

var B = function(){};
B.prototype = a;
a.constructor = B;

var b1 = new B();
var b2 = new B();

console.log(b1.foo); // undefined
console.log(b2.foo); // undefined

a.foo = [1];

console.log(b1.foo); // [1]
console.log(b2.foo); // [1]

console.log(b1.foo === b2.foo); // true

Jika Anda tertarik, ada penjelasan bagus di sini .

Bukankah itu yang dilakukan Bacbone dengan itemArray dalam kasus ini? itemArray ada di prototipe, mengapa perilaku yang kita alami terjadi?

Persis. Itulah mengapa saya merekomendasikan membuat itemArray di initialize daripada sebagai properti prototipe.

@braddunbar Terima kasih atas penjelasan dan tautannya - Di satu sisi, ini masih merupakan perilaku yang aneh (dan tidak terduga), tetapi di sisi lain sangat masuk akal untuk membagikan properti di antara tampilan.

Saya akan membaca artikel JavaScript Garden dan saya yakin semuanya akan menjadi jelas :).

Apakah halaman ini membantu?
0 / 5 - 0 peringkat