2013-07-16 3 views
2

Marionette와 처음으로 놀고 있습니다. ItemView를 다시 렌더링 한 후에 이벤트가 트리거되지 않습니다. 간단한 예 :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 herediscussing it here을 볼 수 있습니다. 대신 뷰에 일어날 이벤트를 수신하기 위해 EVA를 사용

+0

나는 self.contentRegion.show (self.View.ContentOne) 대신'self.View.ContentOne.render()'를 사용하려고했습니다. ',하지만 아무 것도 행복하지 않아. – iBoozyVoozy

+0

예 : 각 ContentView에는 자체적으로 버튼이 있으며이 버튼에 대한 이벤트가 있습니다. 처음에는 모든 이벤트가 정상적으로 트리거되었지만 두 번째로 다시 렌더링 한 후에는 버튼에 대한 이벤트가 트리거되지 않았습니다. – iBoozyVoozy

1

벤트/다른 뷰
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(); 

Andrew Hubbs가 언급 한 첫 번째 렌더링 이후에만 필요하지만

관련 문제