我有这个代码 http://jsfiddle.net/QRcF5/2/
$(function() {
var Header = Backbone.Marionette.ItemView.extend({
template: _.template('<h4>TEST</h4><button>EDIT</button>'),
tagName: 'nav',
triggers: {
'click button': 'btn_clicked'
}
}),
Layout = Backbone.Marionette.Layout.extend({
template: _.template('<header></header>'),
regions: {
header: 'header'
},
events: {
'itemview:btn_clicked': 'clicked'
},
clicked: function() {
alert('Ana are mere');
}
});
layout = new Layout();
$('body').append(layout.render().el);
layout.header.show(new Header());
});
我正在使用带有一个 ItemView 的布局(稍后我想要更复杂的嵌套)并希望在 LAYOUT 中捕获 ITEMVIEW 中发生的事件。似乎它没有向上冒泡,或者我在这里做错了什么。
更新 1 我已经尝试过事件、触发器(针对子级)和事件(针对父级),但我仍然无法在父级内部捕获事件。
我可以用:
_.extend(App.vent, Backbone.Events);
Backbone.Marionette.ItemView.extend({
....
App.vent.trigger('btn_clicked');
....
});
Backbone.Marionette.Layout.extend({
....
App.vent.on('btn_clicked', function() { doCoding(); });
....
});
但是这样我就打破了封装。有没有办法通过使用 Marionette 触发器事件来保持封装并将其全部保留在布局中而不污染整个应用程序?
更新 2
我已经更新了 jsfiddle 以使用 _.extend(vent, Backbone.Events)。如果有人对此有更好的模式,请告诉我们:D