7

마리오네트 레이아웃 표시, 숨기기 및 다시 표시하는 데 문제가 있습니다. 나는이 문제가 일반 Backbone Views와 Marionette ItemViews에도 적용된다고 생각한다.레이아웃 표시, 숨기기, 다시 표시 휴식 이벤트

요약하면 부모보기가 있습니다. 초기화 될 때, 그것은 탭 내용으로 사용될 두 개의 자식 레이아웃을 생성합니다. 문제는 한 탭의 탭 콘텐츠가 표시되고 다른 탭의 콘텐츠가 대신 표시되면 원래 탭 콘텐츠가 다시 표시 될 때 이벤트가 더 이상 작동하지 않는다는 것입니다.

하위 레이아웃은 부모 레이아웃의 initialize 함수에서 만들어지고 다시 탐색 할 때 상태를 보존해야하므로 다시 사용됩니다. 너무 많은 Video Link

감사 :

여기 enter image description here

가 깨진 이벤트를 보여주는 비디오입니다 :

는 여기에 대해 이야기하고있는 것을 증명하는 sample application입니다!

+1

조금 놀랐이 질문을 downvoted있어 것을 ... 내가 이것을을 downvoted 사람 모르겠지만 문제는 노력을 보여 주었다 생각 –

+1

연구, , 그리고 선명도. –

답변

4

문제는 하위 레이아웃의 새로운 부분을 만들지 않고 기본 레이아웃에서 시작한 부분을 다시 사용하는 것입니다. 따라서 지역의 콘텐츠를 변경하면 Marionette의 View close() 함수의 일부로 이벤트가 언 바인딩됩니다.

initialize: function(){ 
    _.bindAll(this); 
    // CREATE SUB LAYOUTS 
    this.tab1Layout = B.tab1Layout; 
    this.tab2Layout = B.tab2Layout; 
}, 

을 그리고 이런 식으로 레이아웃을 호출 :

당신은 그런 당신의 초기화 기능을 변경해야합니다 당신이하지 않으려면

// EVENT HANDLERS 
on_show_tab_1_click: function(event){ 
    this.content.show(new this.tab1Layout()); 
}, 
on_show_tab_2_click: function(event){ 
    this.content.show(new this.tab2Layout()); 
} 
+0

자식 레이아웃의 상태를 유지해야합니다. 매번 하위 레이아웃을 다시 만들지 않고이 작업을 수행 할 수있는 방법이 있습니까? –

+0

하위 레이아웃의'close()'함수를 오버라이드 할 수 있으므로 닫을 때 이벤트가 꺼지지 않을 것입니다. 원래 닫는 기능 (행 182)에 대한 백본 마리오넷의 소스 코드를 확인하고 필요에 따라 "가벼운"버전을 만들어보십시오. – Ingro

2

마다의 탭 뷰를 다시 초기화 tab change를 사용하면 view.delegateEvents()를 수동으로 호출 할 수 있습니다.

상태를 보존하려면 다른 옵션을 사용하십시오. 두 탭 렌더링 단순히 비활성 탭 영역을 숨길 수 :

// Assume both regions have initialised views, tab2Region is hidden, 
// tab1Region is shown. 
// Swap between tabs: 
this.tab1Region.$el.hide() 
this.tab2Region.$el.show()