2013-07-16 106 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(); 

雖然之後的第一個渲染由安德魯·哈布斯提到了這一點,只需要