我第一次和Marionette一起玩。 重新渲染ItemViews后,不会触发其事件。 简单的例子:
App = new Marionette.Application;
App.addRegions({
headerRegion: '#header',
contentRegion: '#content',
});
App.addInitializer(function () {
this.Views = {
MainMenu : new MainMenuView(),
ContentOne : new ContentOneView(),
ContentTwo : new ContentTwoView(),
};
});
App.addInitializer(function () {
var self = this;
var eva = self.vent;
eva.listenTo(self.Views.MainMenu, 'content1', function () {
self.contentRegion.show(self.Views.ContentOne);
});
eva.listenTo(self.Views.MainMenu, 'content2', function () {
self.contentRegion.show(self.Views.ContentTwo);
});
});
App.on('start', function () {
var self = this;
self.contentRegion.show(self.View.ContentOne);
});
App.start();
重新渲染ContentOneView& ContentTwoView,他们的事件没有被触发。 我做错了什么?
答案 0 :(得分:5)
您遇到的问题是region.show()
将关闭当前占据该区域的任何视图。这样做会取消视图的事件。在初始region.show()
之后,您应该在视图上手动调用渲染。
答案 1 :(得分:2)
我设法通过在布局中显示视图时委派事件来解决这个问题:
layoutView.content.show(contentView);
contentView.delegateEvents();
虽然只有在Andrew Hubbs提到的第一次渲染之后才需要这样做
答案 2 :(得分:1)
而不是使用eva来监听视图上发生的事件,尝试听eva以获取其他视图传递的事件
App.addInitializer(function () {
var eva = self.vent;
var self = this;
this.listenTo(eva, 'someStringHere', function(){/*do stuff here*/};
});
然后在您的视图中,您可以通过eva / vent
触发事件var eva = self.vent;
eva.trigger("someStringHere");