การสร้างตัวสร้างฐานพิเศษจาก Backbone จะง่ายกว่าไหมดูที่จัดการการสืบทอดเหตุการณ์ตามลำดับชั้น
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
}
สิ่งนี้ช่วยให้เราสามารถลด (ผสาน) เหตุการณ์ที่แฮชตามลำดับชั้นเมื่อใดก็ตามที่เราสร้าง 'คลาสย่อย' ใหม่ (ตัวสร้างลูก) ใหม่โดยใช้ฟังก์ชันขยายที่กำหนดใหม่
# 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: ....
}
ด้วยการสร้างมุมมองพิเศษ: BaseView ที่กำหนดฟังก์ชันการขยายใหม่เราสามารถมีมุมมองย่อย (เช่น AppView, SectionView) ที่ต้องการสืบทอดเหตุการณ์ที่ประกาศของมุมมองหลักของพวกเขาก็ทำได้โดยการขยายจาก BaseView หรืออนุพันธ์อย่างใดอย่างหนึ่ง
เราหลีกเลี่ยงความจำเป็นในการกำหนดฟังก์ชันเหตุการณ์ของเราโดยใช้โปรแกรมในมุมมองย่อยของเราซึ่งในกรณีส่วนใหญ่จำเป็นต้องอ้างถึงตัวสร้างหลักอย่างชัดเจน