7

Problemy z wyświetlaniem, ukrywaniem, a następnie ponowne wyświetlanie układów marionetek. Uważam, że ten problem dotyczy również zwykłych widoków kręgosłupa i przedmiotów marionetek.Pokazywanie, ukrywanie, a następnie ponowne wyświetlanie podziałów układów Zdarzenia

Podsumowując, mam widok nadrzędny. Po zainicjowaniu tworzy dwa układy potomne, które mają być używane jako zawartość tabulatora. Problem polega na tym, że gdy wyświetlana jest zawartość karty z jednej karty, zamiast niej wyświetlana jest zawartość z innej karty, gdy zawartość oryginalnej karty jest wyświetlana ponownie, zdarzenia nie działają.

Układy podrzędne są tworzone w funkcji nadrzędnego układu initialize i ponownie wykorzystywane, ponieważ ich stany muszą zostać zachowane, gdy nawigacja wraca do nich.

Oto sample application który pokazuje, co mówię:

enter image description here

Oto film pokazujący połamane zdarzeń: Video Link

Dzięki tak dużo!

+1

Trochę zdziwiony, że to pytanie ale downvoted ... –

+1

nie wiem kto downvoted, ale myślałem, że kwestia pokazał wysiłek badawczy i jasność. –

Odpowiedz

4

Problem polega na tym, że nie tworzysz nowej istoty układów podrzędnych i po prostu ponownie używasz tej, którą zainicjujesz w głównym układzie. Kiedy zmienisz zawartość swojego regionu, zdarzenia zostaną rozłączone w ramach funkcji close() widoku Marionetki.

Należy zmienić funkcję inicjalizacji tak:

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

i wywołać w ten sposób układy:

// 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

Potrzebuję zachować stany układów potomnych. Czy jest jakiś sposób, aby to zrobić bez ponownego tworzenia układów potomnych za każdym razem? –

+0

Myślę, że możesz zastąpić funkcję 'close()' w twoich pod-układach, więc zdarzenia nie zostaną usunięte po ich zamknięciu. Sprawdź kod źródłowy marionetki głównej dla oryginalnej funkcji zamknięcia (wiersz 182) i spróbuj utworzyć "lekką" wersję dla swoich potrzeb. – Ingro

2

Jeśli nie chcesz, aby ponownie zainicjować kartę widoki na każdym zmiana zakładce można nazwać view.delegateEvents() ręcznie:

// views[] is array of initialized tab views 
// Swap from displaying views[0] to views[1] 
currentTabIndex = 1 
this.myRegion.show(views[currentTabIndex]) 
views[currentTabIndex].delegateEvents() 

dla zachowania stanu, innym rozwiązaniem jest renderowanie zarówno karty i po prostu ukryć nieaktywny obszar zakładka:

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