2012-12-29 3 views
24

Sto creando un'applicazione a singola pagina, e sono abbastanza nuovo per il backbone. Ho un problema con la creazione di più viste che utilizza lo stesso wrapper-div.backbone remove view cancella el

La mia configurazione:

Ho aggiunto una funzione vicino a tutte le viste:

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

Ho un involucro-div dove voglio rendere vista, rimuoverli e rendere nuovi. Quindi il mio SetupView assomiglia a questo:

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

Dalla funzione dove sostituisco vista chiudo la corrente (aperto) Vista in questo modo:

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

Domanda

mio problema è che Ho più viste che usano lo stesso wrapper-div. Ma quando chiudo una vista, questo wrapper-div sembra essere rimosso, e la prossima vista che cerco di creare non può trovare questo div.

Immagino che ci sia una soluzione facile? Voglio riutilizzare lo stesso wrapper e rimuovere solo la vista al suo interno, non il wrapper stesso.

+0

'remove' rimuove l'elemento dal DOM. Ma penso di aver frainteso 'el'. Ho pensato che fosse il luogo in cui il nuovo elemento è stato iniettato, ma ora ho imparato che diventa parte del nuovo elemento, e quindi viene rimosso quando chiamo 'remove'. – swenedo

+3

Giusto. In generale, è meglio lasciare che ogni vista gestisca il proprio 'el': la vista dovrebbe creare il suo' el', fare le cose e rimuoverlo quando la vista viene rimossa. Il chiamante mette il 'el' della vista dentro un contenitore controllato dal chiamante. Non riutilizzare gli elementi DOM per più viste consente di evitare molti problemi. –

+1

@muistooshort - un buon consiglio. mai pensato a questo - ha perfettamente senso. grazie. – cheshireoctopus

risposta

17

Nello scenario non utilizzare un elemento DOM esistente come valore "el". Backbone creerà l'elemento per te. Quando si crea un'istanza della vista, è possibile eseguire le seguenti operazioni per collegarlo all'elemento di spostamento esistente.

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

Grazie, questo ha risolto il mio problema! – swenedo

25

Proprio come aggiuntivo (per riferimento futuro): Un'altra opzione è quella sovrascrivere i subviews remove modo che solo svuota $el invece di rimuoverlo. Per esempio.

Personalmente preferisco questo, in quanto elimina la necessità di inserire elementi wrapper che non hanno reale utilizzo.

+1

Sono d'accordo. questo metodo dovrebbe essere incorporato in Backbone, passando da 'empty' a' remove' in base al fatto che 'el' sia dichiarato o meno. –

+6

Vorrei anche aggiungere "this. $ El.empty(). Off()" per assicurarmi che tutti gli eventi siano disattivati. –

+1

Per riferimento, l'implementazione di Backbone è [qui] (http://backbonejs.org/docs/backbone.html#section-158). –