2012-01-31 22 views
5

Sto lavorando a un'applicazione backbone.js e ho raggiunto il punto in cui ho un numero di router e viste che rappresentano ciascuna parte della mia applicazione. Nell'esempio del router semplificato di seguito, ho due posizioni; account & users.Pulizia delle viste con backbone.js?

Entrambe le viste in ogni posizione rendono il loro contenuto a un elemento reciproco, denominato #appcontainer. Il mio buon senso dice che dovrei assicurarmi di remove ogni vista prima di avviarne un'altra per evitare collisioni tra associazioni, DOM e quant'altro.

Tuttavia, poiché non posso sapere con certezza se una vista è già stata creata, non è possibile chiamare esplicitamente previousView.remove() dall'interno del router o delle visualizzazioni.

Sarebbe sufficiente aggiungere $(this.el).empty() al costruttore di ogni vista per eliminare eventuali collegamenti ed elementi precedenti dal DOM?

Ecco l'esempio del router?

var myRouter = Backbone.Router.extend({ 

    routes: { 
     "account": "account", 
     "users": "users" 
    }, 

    account: function() { 
     view = new AccountView({}); 
     view.render(); 
    }, 

    users: function() { 
     view = new UserView({}); 
     view.render(); 
    } 

}); 

risposta

11

ho una molto semplice implementazione, sto solo iniziando la mia domanda ora e non so come questo sta andando a reggere nel lungo periodo, ma sembra qualcosa di simile:

Modifica: Ecco come sarà l'intero file. questo.render sarà un'altra funzione di myRouter.

var myRouter = Backbone.Router.extend({ 
    routes: { 
     'path/to/account' : 'account', 
     'path/to/users': 'users' 
    } 

    account: function() { 
     view = new AccountView({}); 
     this.render(view); 
    }, 

    users: function() { 
     view = new UserView({}); 
     this.render(view); 
    }, 

    render: function (view) { 
     //Close the current view 
     if (this.currentView) { 
      this.currentView.remove(); 
     } 

     //render the new view 
     view.render(); 

     //Set the current view 
     this.currentView = view; 

     return this; 
    } 
}); 
+0

Ciao! Grazie per la tua risposta. Il metodo '.remove()' -method di jQuery si separa da backbones '.remove()' sulle viste? – Industrial

+2

Backbone's .remove() è solo un alias per jquery's .remove(), quindi per questi scopi sono uguali. – MrGrigg

+1

@MrGrigg ** Potresti chiarire dove andrebbe il metodo di rendering? Sembra che vada nel router stesso, ma voglio essere sicuro ... ** _ Mi piace molto l'aspetto di questo codice e, a prima vista, sembra che sarebbe un bel modo per strutturare un'applicazione. – Emerson

Problemi correlati