我有这个代码 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 我已经尝试了事件、触发器(对于 child )和事件(对于 parent ),但我仍然无法在 parent 内部捕获事件。
我可以使用:
_.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
最佳答案
我找到了解决方案(隐藏在文档中的某处,在布局、区域和 View 之间建立了一些联系)!
在父级(布局)和子级(itemView)之间仅的通信上下文中:
1) child 触发自定义事件(反对 vent extend Backbone.Events - 它只与有权访问它的人对话 = 封装)
triggers: {
'click button': 'custom_event:btn_clicked'
}
2) parent 通过 on('show',....) 收听此事件有权访问 child >
initialize: function() {
var that = this; // needed for the listenTo which overrides 'THIS'
this.header.on('show', function(view) {
this.listenTo(view, 'custom_event:btn_clicked', that.clicked);
});
},
例子:
layout = new Layout();
$('body').append(layout.render().el);
layout.header.show(new Header()); // Here we get access to child and its events
(隐藏的) Marionette 的力量。 (我的意思是当我说隐藏时,因为相对较新,文档是准系统并且复杂示例很少)。
只要有一点毅力,任何事情都可以完成。
关于javascript - itemView 触发到达父级的自定义事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18309436/