2013-07-16 61 views
2

我正在玩木偶第一次。 重新呈现ItemViews之后,它们的事件未触发。 简单的例子:重新渲染后的Marionette ItemView事件

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,不会触发他们的活动。 我做错了什么?

回答

5

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

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

+0

我试着使用'self.View.ContentOne.render()''而不是self.contentRegion.show(self.View.ContentOne) ',但没有什么令人开心的。 – iBoozyVoozy

+0

示例:每个ContentView本身都有一个按钮,并且该按钮为事件。第一次所有事件正常触发,但是第二次重新渲染后,按钮事件没有被触发。 – iBoozyVoozy

1

而不是用EVA来听取意见所发生的事件,试图听EVA为其他意见

App.addInitializer(function() { 
    var eva = self.vent; 
    var self = this; 
    this.listenTo(eva, 'someStringHere', function(){/*do stuff here*/}; 
}); 

,然后在你的意见,你可以触发通过EVA事件中传递的事件/通风

var eva = self.vent; 
eva.trigger("someStringHere"); 
2

我管理通过使用委托的事件来解决这个问题时,将显示在布局的视图:

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

虽然之后的第一个渲染由安德鲁·哈布斯提到了这一点,只需要