2

我第一次和木偶一起玩。重新渲染 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 后,它们的事件未触发。我做错了什么?

4

3 回答 3

5

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

您可以在此处看到对此的解释和在此处讨论的问题。

于 2013-07-16T23:26:27.987 回答
2

当视图显示在布局中时,我设法通过委托事件来解决这个问题:

layoutView.content.show(contentView);
contentView.delegateEvents();

虽然这只有在 Andrew Hubbs 提到的第一次渲染之后才有必要

于 2013-10-02T14:36:40.213 回答
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");
于 2013-07-17T02:07:15.627 回答