重新渲染后的Marionette ItemView事件

时间:2013-07-16 23:23:12

标签: javascript backbone.js marionette

我第一次和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,他们的事件没有被触发。 我做错了什么?

3 个答案:

答案 0 :(得分:5)

您遇到的问题是region.show()将关闭当前占据该区域的任何视图。这样做会取消视图的事件。在初始region.show()之后,您应该在视图上手动调用渲染。

您可以看到this explained here和问题discussing it here

答案 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");