2012-02-21 11 views
14

Se devo conservare vista in window.myView variabile, renderla, quindi chiamare in javascript console:Perché gli eventi di Backbone sulla sostituzione di html non funzionano?

$('#container').html('') 

e quindi chiamare:

$('#container').html(window.myView.$el) 

eventi Bound smetteranno di funzionare.

Sono abbastanza sicuro che dovrebbe essere così, ma:

  • esattamente perché funziona in questo modo?
  • come re-render sottoparte vista senza perdita di binding di eventi?
  • perché chiamare myView.render() non perderà i binding di evento?

Aggiornamento:

Trovato this articolo. È questa la ragione?

Assicurarsi jQuery non sta scaricando gli eventi quando non si desidera che

Se si sta costruendo un app in cui si crea una vista in tempo reale e di collegare/li rimuove al DOM voi, potrebbe avere un problema Ogni volta che rimuovi una vista dal dom, jQuery scarica tutti gli eventi. Quindi non puoi avere un riferimento a una vista e rimuoverlo dal dom e quindi ricollegarlo in un secondo momento. Tutti i tuoi eventi sarebbero stati scaricati. Se vuoi mantenere le viste, un'idea migliore è nasconderle usando display: none. Tuttavia, non dovresti abusare di ciò e riciclare viste che non utilizzerai per un po '(e prevenire perdite di memoria).

+0

Grazie per questa domanda. Ho avuto un problema simile con Spine e non riuscivo a capire cosa stesse succedendo. –

risposta

18

jQuery empty, html e remove eventi stanno pulendo tutte le associazioni degli eventi jQuery e di dati per evitare perdite di memoria (è possibile controllare jQuery codice sorgente per cleanData metodo per capire di più - si tratta di un metodo non documentato)

view.render() non rimuove gli eventi perché gli eventi di visualizzazione Backbone sono associati utilizzando la delega di eventi e sono associati alla vista el piuttosto che direttamente agli elementi nella vista.

Se si desidera riutilizzare le proprie visualizzazioni, è possibile rimuoverle utilizzando il metodo jQuery detach che mantiene tutti gli eventi e i dati associati sebbene sia necessario prestare attenzione a non produrre perdite di memoria in questo modo. (jquery detach docs)

Se si desidera andare alla prima, è sempre possibile eseguire nuovamente il binding degli eventi Backbone utilizzando il metodo Backbone.View delegateEvents. (backbone doc)

ps. è anche più pulito e più ottimale da utilizzare jQuery .empty() piuttosto che .html('') poiché il metodo jQuery html chiama sempre vuoto per cancellare tutti gli eventi e i dati prima di inserire il nuovo html. Inoltre, non mischiare mai jQuery e innerHTML DOM nativo in quanto potrebbe causare perdite di memoria causate dalla mancata pulizia di eventi/dati jQuery

+1

chiamando 'questo.delegateEvents() 'nella vista ha funzionato come un fascino. Grazie. –

+0

Urrà per .delegateEvents! – SimplGy

+0

Considerare inoltre di abbattere e ricreare tutte le viste secondarie durante il rendering della vista genitore. –

Problemi correlati