Backbone.View'dan, hiyerarşideki olayların kalıtımını yöneten özel bir temel oluşturucu oluşturmak daha kolay olmaz mıydı.
BaseView = Backbone.View.extend {
# your prototype defaults
},
{
# redefine the 'extend' function as decorated function of Backbone.View
extend: (protoProps, staticProps) ->
parent = this
# we have access to the parent constructor as 'this' so we don't need
# to mess around with the instance context when dealing with solutions
# where the constructor has already been created - we won't need to
# make calls with the likes of the following:
# this.constructor.__super__.events
inheritedEvents = _.extend {},
(parent.prototype.events ?= {}),
(protoProps.events ?= {})
protoProps.events = inheritedEvents
view = Backbone.View.extend.apply parent, arguments
return view
}
Bu, yeniden tanımlanmış genişletme işlevini kullanarak yeni bir 'alt sınıf' (alt sınıf oluşturucu) oluşturduğumuzda olayları hiyerarşiyi azaltmamızı (birleştirmemizi) sağlar.
# AppView is a child constructor created by the redefined extend function
# found in BaseView.extend.
AppView = BaseView.extend {
events: {
'click #app-main': 'clickAppMain'
}
}
# SectionView, in turn inherits from AppView, and will have a reduced/merged
# events hash. AppView.prototype.events = {'click #app-main': ...., 'click #section-main': ... }
SectionView = AppView.extend {
events: {
'click #section-main': 'clickSectionMain'
}
}
# instantiated views still keep the prototype chain, nothing has changed
# sectionView instanceof SectionView => true
# sectionView instanceof AppView => true
# sectionView instanceof BaseView => true
# sectionView instanceof Backbone.View => also true, redefining 'extend' does not break the prototype chain.
sectionView = new SectionView {
el: ....
model: ....
}
Özel bir görünüm oluşturarak: genişletme işlevini yeniden tanımlayan BaseView, üst görünümlerinin bildirilen olaylarını miras almak isteyen alt görünümlere (AppView, SectionView gibi) sahip olabiliriz, bunu BaseView veya türevlerinden birinden genişleterek yapar.
Olay işlevlerimizi alt görünümlerimizde programlı olarak tanımlama ihtiyacından kaçınıyoruz, çoğu durumda ana kurucuya açıkça atıfta bulunmamız gerekir.