Wäre es nicht einfacher, einen speziellen Basiskonstruktor aus Backbone.View zu erstellen, der die Vererbung von Ereignissen in der Hierarchie behandelt?
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
}
Auf diese Weise können wir den Ereignis-Hash in der Hierarchie reduzieren (zusammenführen), wenn wir mithilfe der neu definierten Erweiterungsfunktion eine neue Unterklasse (untergeordneten Konstruktor) erstellen.
# 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: ....
}
Durch Erstellen einer speziellen Ansicht: BaseView, die die Erweiterungsfunktion neu definiert, können Unteransichten (wie AppView, SectionView) vorhanden sein, die die deklarierten Ereignisse ihrer übergeordneten Ansicht erben möchten. Dies geschieht einfach durch Erweitern von BaseView oder einer ihrer Ableitungen.
Wir vermeiden die Notwendigkeit, unsere Ereignisfunktionen programmgesteuert in unseren Unteransichten zu definieren, die in den meisten Fällen explizit auf den übergeordneten Konstruktor verweisen müssen.