Non sarebbe più semplice creare un costruttore di base specializzato da Backbone.View che gestisce l'ereditarietà degli eventi nella gerarchia.
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
}
Questo ci consente di ridurre (unire) gli eventi hash lungo la gerarchia ogni volta che creiamo una nuova 'sottoclasse' (costruttore figlio) utilizzando la funzione di estensione ridefinita.
# 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: ....
}
Creando una vista specializzata: BaseView che ridefinisce la funzione di estensione, possiamo avere sottoview (come AppView, SectionView) che vogliono ereditare gli eventi dichiarati della loro vista genitore, lo fanno semplicemente estendendola da BaseView o da uno dei suoi derivati.
Evitiamo la necessità di definire in modo programmatico le nostre funzioni evento nelle nostre sottoview, che nella maggior parte dei casi devono fare riferimento esplicitamente al costruttore padre.