在Marionette,我们有一个"主视图"我们想扩展。
var PaginatedDropdown = Marionette.CompositeView.extend({
template: template,
events: {
'click': function () { return 'hello';},
'keyup': function () { return 'goodbye'}
},
childViewOptions: {
tagName: 'li'
}
});
理想的用例是通过更具体的视图来扩展这个视图或类,这些视图将实现大多数特性,并修改主类/视图的一些特性:
var MotorcycleColorChooserDropdown = PaginatedDropdown.extend({
events: {
'mouseenter': function () { return 'vroom'; };
}
});
问题是我们不确定如何有选择地修改诸如事件哈希之类的事情,或者覆盖某些子视图选项。具体做法是:
如果MotorcycleColorChooserDropdown
有events
个对象,它将覆盖PaginatedDropdown
正在侦听的所有事件。我们如何混搭? (允许MotorcycleColorChooserDropdown
上的事件对象与PaginatedDropdown
的事件对象结合使用?
潜在无法解决:如果我们想要PaginatedDropdown
click
事件的所有功能,但我们还希望在MotorcycleColorChooserDropdown
中添加一些内容,该怎么办?我们是否只需手动将所有功能从Parent添加到Child类中?
我们考虑过根本不做像这样的扩展视图,或做MotorcycleColorChooserDropdown = PaginatedDropdown.extend();
之类的事情,然后一次做MotorcycleColorChooserDropdown.events = PaginatedDropdown.events.extend({...});
,但这看起来很乱,很丑,而且我确定那里和#39;更好的方式。
答案 0 :(得分:2)
这是我一直在做的事情
var PaginatedDropdown = Marionette.CompositeView.extend({
template: template,
events: {
'click': 'onClick',
'keyup': function () { return 'goodbye'}
},
onClick:function(e){
return 'hello'
},
childViewOptions: {
tagName: 'li'
}
});
var MotorcycleColorChooserDropdown = PaginatedDropdown.extend({
events: _.extend({
'click': 'onClick',
'mouseenter': function () { return 'vroom'; };
},PaginatedDropdown.prototype.events),
onClick:function(e){
PaginatedDropdown.prototype.onClick.call(this,e)
//code
}
});
对于您的第一个问题,我只是将孩子events
与父events
一起展开。
至于第二个,我只是从子进程中调用父方法,传入子上下文和事件对象。
它非常冗长,但也非常明确。阅读代码的人会确切知道发生了什么。
答案 1 :(得分:0)
你可以:
foo