Backbone: Tambahkan dukungan pengambil/penyetel untuk memperluas metode

Dibuat pada 9 Feb 2015  ·  12Komentar  ·  Sumber: jashkenas/backbone

Karena getter/setter didukung IE9+ dan akan jauh lebih lazim dengan ES6, alangkah baiknya jika metode perluasan Backbone mendukungnya.

var Person = Backbone.Model.extend({
  get fullName() {
    return this.get('firstName') + ' ' + this.get('lastName');
  }
});

var elonMusk = new Person({
  firstName: 'Elon', 
  lastName: 'Musk'
});

console.log(person.fullName); // >> Elon Musk

Saat ini ini akan menghasilkan undefined is not a function karena menggunakan _.extend memanggil pengambil.

change wontfix

Komentar yang paling membantu

Tentu, saya akan melakukannya

Semua 12 komentar

Apakah ada alasan yang tidak bisa ditulis lebih baik sebagai person.fullName() sehingga Anda tahu itu panggilan fungsi?

Menggunakan getter dan setter sebagian besar merupakan ide yang buruk di JS, dan mereka bertentangan dengan salah satu ide inti dari Backbone Models. Saya ragu Anda akan melihat dukungan ditambahkan dalam waktu dekat.

Lebih dari segalanya, ini sebagian akan disejajarkan dengan sintaks kelas baru. Belum ada inisialisasi properti di sintaks kelas atau bahkan spesifikasi apa pun untuknya, jadi interop akan menjadi masalah.

mereka bertentangan dengan salah satu ide inti dari Backbone Models.

Apa ide inti itu?

Getter juga merupakan solusi parsial untuk masalah yang ada di Backbone.Collection dengan model.idAttribute .

Menghabiskan beberapa menit mencoba membuat jsperf dengan solusi berbeda:
http://jsperf.com/backbone-extend-with-define-property

Apa ide inti itu?

Gagasan bahwa pengaturan dan pengambilan properti pada objek harus transparan dan logis untuk dipikirkan. Anda harus selalu tahu bahwa obj.prop = val tidak pernah melakukan apa pun selain menyetel nilai properti itu (juga untuk pengambilan), sementara kita harus menggunakan fungsi untuk menangani hal-hal seperti properti yang dihitung dan mengubah peristiwa. Itulah alasan utama metode pembungkus get dan set di sekitar attributes .

Getter juga merupakan solusi parsial untuk masalah yang ada di Backbone.Collection dengan model.idAttribute.

Adakah alasan pembungkus _.result saat ini tidak berfungsi untuk ini? idAttribute dapat berupa primitif atau fungsi. Ini juga sedang diperbaiki dengan modelId .

Maaf saya seharusnya menautkan ke masalah yang saya bicarakan: https://github.com/jashkenas/backbone/issues/3408

Saya mengemukakan ini terutama karena sintaks kelas Backbone sebagian besar sudah kompatibel dengan sintaks kelas ES, dan tampaknya masuk akal jika mereka kompatibel mengingat dukungan tambahan untuk skrip kopi.

CoffeeScript tidak mendukung setter dan getter sebagian besar karena alasan yang sama (lihat masalah di sana untuk beberapa latar belakang, dimulai dengan https://github.com/jashkenas/coffeescript/pull/2902). Mereka seharusnya tidak menjadi penghalang untuk mendukung objek Backbone sebagai kelas.

Maaf saya seharusnya menautkan ke masalah yang saya bicarakan: #3408

Mengingatkanku? Aku berusaha keras untuk melihat koneksi dari kelelawar.

Selain itu, perubahan apa pun pada extend harus dilakukan di _.extend , bukan di sini. Menutup sebagai wontfix.

CoffeeScript tidak mendukung setter dan getter sebagian besar karena alasan yang sama

Saya tidak berbicara tentang getter/setter, saya berbicara tentang bagaimana Backbone menambahkan __super__ untuk interop dengan CoffeeScript, dan bagaimana masuk akal untuk mendukung kelas ES6 dengan cara yang sama.

Mengingatkanku? Aku berusaha keras untuk melihat koneksi dari kelelawar.

Collection.extend({
  model: function() { return Model }
});
//
collection.modelId(model); // 'id' regardless if that's correct or not.
Collection.extend({
  get model() { return Model }
});
//
collection.modelId(model); // correct for *some* of the common cases.

Selain itu, setiap perubahan untuk memperpanjang harus dilakukan di _.extend, bukan di sini. Menutup sebagai wontfix.

Itu jelas bukan tempat yang tepat untuk perubahan ini, jika ada, itu akan ada di metode _.assign yang baru. Tetapi jauh lebih masuk akal untuk didukung di sini IMO.

Juga, sebelum masalah ini ditutup dan dilupakan, saya ingin membahas mengapa tidak apa-apa untuk perpanjangan Backbone memiliki masalah interop dengan kelas ES tetapi bukan kelas CoffeeScript.

Mengingat IE Tech Preview adalah satu- satunya browser dengan dukungan class (bahkan Traceur dan 6to5 belum mengonversi extends ), kami masih jauh dari ini. diperlukan. Selain itu, Backbone tidak akan berusaha keras untuk mematahkan kompatibilitas mundur hanya untuk mendukung fitur yang bukan ide bagus untuk memulai.

bahkan Traceur dan 6to5 belum mengonversi extends

Mereka berdua sebenarnya, mereka hanya memerlukan dukungan untuk __proto__ untuk properti statis yang didukung secara luas.

Juga tidak ada alasan kompatibilitas kata-balik perlu dilanggar, bahkan dapat dibuat lebih cepat jika digunakan secara selektif Object.setPrototypeOf jika tersedia.

@thejameskyle Ingin mengubah ini menjadi PR, bukan masalah? Ini layak untuk dilihat.

Tentu, saya akan melakukannya

Apakah itu di jalan? Apakah Anda memiliki inti atau sesuatu tentang itu? Saya ingin mengambil gambar.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

gfranko picture gfranko  ·  18Komentar

zowers picture zowers  ·  11Komentar

tribalvibes picture tribalvibes  ·  11Komentar

rafde picture rafde  ·  9Komentar

omenking picture omenking  ·  10Komentar