Dokumentasi Backbone menyatakan:
Properti peristiwa juga dapat didefinisikan sebagai fungsi yang mengembalikan hash peristiwa, untuk membuatnya lebih mudah untuk menentukan peristiwa Anda secara terprogram, serta mewarisinya dari tampilan induk.
Bagaimana Anda mewarisi peristiwa tampilan orang tua dan memperluasnya?
Tampilan Orang Tua
var ParentView = Backbone.View.extend({
events: {
'click': 'onclick'
}
});
Tampilan Anak
var ChildView = ParentView.extend({
events: function(){
????
}
});
parentEvents = _.result(ParentView.prototype, 'events');
alih-alih 'secara manual' memeriksa apakahevents
itu suatu fungsi._.result
, yang tidak saya perhatikan sebelumnya. Bagi siapa saja yang tertarik, berikut adalah jsfiddle dengan sekelompok variasi pada tema ini: jsfiddlethis
versus harus memanggil kelas induk dengan nama instance. Terima kasih banyak untuk ini.Prajurit itu. Jawaban keduanya bagus. Untuk lebih menyederhanakannya, Anda bisa melakukan hal berikut
Kemudian, cukup tentukan acara Anda di salah satu kelas dengan cara yang biasa.
sumber
this.events
&ParentView.prototype.events
sebaliknya jika keduanya mendefinisikan penangan pada acara yang sama, penangan Induk akan menimpa Pengendali Anak.{},ParentView.prototype.events,this.events
delegateEvents
dipanggil dalam konstruktor untuk mengikat acara. Jadi ketika Anda memperpanjangnya diinitialize
, kenapa belum terlambat?initialize
dalam beberapa kasus (kemudian harus berurusan dengan mengelola hierarki fungsi itu juga) hanya untuk menggabungkan objek acara. Tampak lebih bersih bagi saya untuk menjagaevents
penggabungan dalam dirinya sendiri. Karena itu, saya tidak akan memikirkan pendekatan ini, dan selalu menyenangkan dipaksa untuk melihat sesuatu dengan cara yang berbeda :)Anda juga bisa menggunakan
defaults
metode ini untuk menghindari pembuatan objek kosong{}
.sumber
Jika Anda menggunakan CoffeeScript dan mengatur fungsi ke
events
, Anda dapat menggunakansuper
.sumber
Bukankah lebih mudah untuk membuat konstruktor dasar khusus dari Backbone.View yang menangani pewarisan peristiwa ke atas hierarki.
Hal ini memungkinkan kita untuk mengurangi (menggabungkan) peristiwa hash ke bawah hierarki setiap kali kita membuat 'subclass' baru (konstruktor anak) dengan menggunakan fungsi perluasan yang didefinisikan ulang.
Dengan membuat tampilan khusus: BaseView yang mendefinisikan ulang fungsi perluasan, kita dapat memiliki subview (seperti AppView, SectionView) yang ingin mewarisi kejadian yang dideklarasikan tampilan induknya, cukup lakukan dengan memperluas dari BaseView atau salah satu turunannya.
Kami menghindari kebutuhan untuk mendefinisikan fungsi acara kami secara terprogram dalam subview kami, yang dalam banyak kasus perlu merujuk ke konstruktor induk secara eksplisit.
sumber
Versi singkat dari saran terakhir @ soldier.moth:
sumber
Ini juga akan berhasil:
Menggunakan straight
super
tidak berhasil untuk saya, baik secara manual menentukanParentView
atau warisan.Akses ke
_super
var yang tersedia dalam coffeescript apa punClass … extends …
sumber
http://danhough.com/blog/backbone-view-inheritance/
sumber
Untuk Backbone versi 1.2.3,
__super__
berfungsi dengan baik, dan bahkan mungkin dirantai. Misalnya:... yang - dalam
A_View.js
- akan menghasilkan:sumber
Saya telah menemukan solusi yang lebih menarik di artikel ini
Ini menggunakan super Backbone dan hasOwnProperty ECMAScript. Contoh progresif kedua bekerja seperti pesona. Ini sedikit kodenya:
Anda juga dapat melakukannya untuk ui dan atribut .
Contoh ini tidak menangani properti yang disetel oleh fungsi, tetapi penulis artikel menawarkan solusi dalam kasus tersebut.
sumber
Untuk melakukan ini sepenuhnya di kelas induk dan mendukung hash peristiwa berbasis fungsi di kelas anak sehingga anak bisa menjadi agnostik warisan (anak harus memanggil
MyView.prototype.initialize
jika digantiinitialize
):sumber
Solusi CoffeeScript ini berfungsi untuk saya (dan mempertimbangkan saran @ soldier.moth):
sumber
Jika Anda yakin bahwa kejadian tersebut
ParentView
telah didefinisikan sebagai objek dan Anda tidak perlu mendefinisikan kejadian secara dinamis diChildView
dalamnya adalah mungkin untuk menyederhanakan jawaban soldier.moth lebih jauh dengan menyingkirkan fungsi dan menggunakan_.extend
secara langsung:sumber
Pola untuk ini yang saya suka adalah memodifikasi konstruktor dan menambahkan beberapa fungsi tambahan:
Saya lebih suka metode ini karena Anda tidak perlu mengidentifikasi variabel induk -satu yang kurang untuk diubah. Saya menggunakan logika yang sama untuk
attributes
dandefaults
.sumber
Wow, banyak jawaban di sini tapi saya pikir saya akan menawarkan satu lagi. Jika Anda menggunakan perpustakaan BackSupport, ia menawarkan
extend2
. Jika Anda menggunakannyaextend2
secara otomatis menangani penggabunganevents
(sertadefaults
dan properti serupa) untuk Anda.Berikut contoh singkatnya:
https://github.com/machineghost/BackSupport
sumber
extend2
) adalah yang terbaik yang bisa saya hasilkan, dan menurut saya itu tidak terlalu buruk: siapa pun yang terbiasa dengan Backbone sudah terbiasa menggunakannyaextend
, jadi dengan cara ini mereka tidak perlu mengingat perintah baru.