2012-12-29 13 views
24

Tworzę aplikację z jedną stroną, a ja jestem całkiem nowy w zakresie szkieletu. Mam problem z tworzeniem wielu widoków, które używają tego samego opakowania-div.Usunięcie widoku szkieletu powoduje, że el

Moja konfiguracja:

Dodałem ścisłą funkcję do wszystkich widokach:

Backbone.View.prototype.close = function(){ 
    this.remove(); 
    this.off(); 
    if (this.onClose){ 
     this.onClose(); 
    } 
} 

Mam otoki DIV gdzie chcę, aby uczynić poglądy, usunąć je i czynią nowe. Więc moja SetupView wygląda następująco:

app.SetupView = Backbone.View.extend({ 
    el: '#my_view_wrapper', 
    ... 
}); 

Z funkcji gdzie mogę zamienić widoki zamknąć obecny (otwarty) Widok tak:

var v = this.model.get('view'); 
v.close(); 

Pytanie

Moim problemem jest to, że Mam wiele widoków przy użyciu tego samego opakowania-div. Ale kiedy zamykam widok, to opakowanie-div wydaje się być usunięte, a następny widok, który próbuję utworzyć, nie może znaleźć tego elementu div.

Sądzę, że istnieje proste rozwiązanie? Chcę ponownie użyć tego samego opakowania i usunąć tylko jego widok, a nie samego opakowania.

+0

'remove' usuwa element z DOM. Ale myślę, że źle zrozumiałem "el". Myślałem, że to właśnie miejsce zostało wstrzyknięte do nowego elementu, ale teraz nauczyłem się, że staje się on częścią nowego elementu, i dlatego jest usuwany, gdy nazywam 'remove'. – swenedo

+3

Dobrze. Generalnie lepiej jest pozwolić każdemu widokowi zarządzać własnym 'el': widok powinien tworzyć jego' el', robić rzeczy do niego i usuwać go po usunięciu widoku. Wywołujący umieszcza widok 'el' w kontenerze, który kontroluje wywołujący. Nie używanie ponownie elementów DOM dla wielu widoków pomaga uniknąć wielu problemów. –

+1

@muistooshort - dobra rada. nigdy o tym nie myślałem - ma sens. Dziękuję Ci. – cheshireoctopus

Odpowiedz

17

W swoim scenariuszu nie używaj istniejącego elementu DOM jako wartości "el". Backbone stworzy dla ciebie element. Podczas tworzenia widoku możesz wykonać następujące czynności, aby dołączyć je do istniejącego elementu zawijania.

$(viewName.render().el).appendTo('#my_view_wrapper'); 
+0

Dziękuję, to rozwiązało mój problem! – swenedo

25

tylko jako dodatek (do wglądu): Inną opcją jest zastąpienie subviews remove tak, że po prostu opróżnia $el zamiast usuwania go. Na przykład.

remove: function() { 
     this.$el.empty().off(); /* off to unbind the events */ 
     this.stopListening(); 
     return this; 
} 

Osobiście preferuję to, ponieważ eliminuje potrzebę wkładania elementów opakowania, które nie mają rzeczywistego zastosowania.

+1

Zgadzam się. ta metoda powinna być wbudowana w szkielet, przełączanie między 'pustym' i' usuń' w zależności od tego, czy 'el' jest zadeklarowane czy nie. –

+6

Dodałbym również 'this. $ El.empty(). Off()', aby upewnić się, że wszystkie zdarzenia są wyłączone. –

+1

Dla odniesienia, implementacja szkieletu jest [tutaj] (http://backbonejs.org/docs/backbone.html#section-158). –

Powiązane problemy