2012-01-31 19 views
5

Estoy trabajando en una aplicación backbone.js y he llegado al punto en que tengo una cantidad de enrutadores y vistas que representan cada parte de mi aplicación. En el ejemplo del enrutador simplificado a continuación, tengo dos ubicaciones; account & users.¿Vistas de limpieza con backbone.js?

Ambas vistas en cada ubicación representan su contenido en un elemento mutuo, llamado #appcontainer. Mi sentido común dice que debo asegurarme de remove cada vista antes de lanzar otra para evitar colisiones en los enlaces, DOM y otras cosas.

Pero como no puedo saber con certeza si una vista ya se ha creado, no puedo llamar explícitamente al previousView.remove() desde mi enrutador o vistas.

¿Sería suficiente agregar $(this.el).empty() al constructor de cada vista para eliminar eventuales enlaces y elementos anteriores del DOM?

Aquí está el ejemplo del enrutador?

var myRouter = Backbone.Router.extend({ 

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

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

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

}); 

Respuesta

11

Tengo una aplicación muy simple, sólo estoy empezando mi aplicación ahora y no saben cómo se va a sostener en el largo plazo, pero se ve algo como esto:

Editar: Así es como se vería todo el archivo. this.render será otra función de 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

Hi! Gracias por tu respuesta. ¿La ejecución de '.remove()' -method de jQuery se separa de backbones '.remove()' en las vistas? – Industrial

+2

.remove() de Backbone() es solo un alias de .remove() de jquery, por lo que para estos fines son iguales. – MrGrigg

+1

@MrGrigg ** ¿Podría aclarar a dónde iría el método de renderizado? Parece que entra en el enrutador, pero quiero asegurarme de ... ** _Me gusta mucho el aspecto de este código y, a primera vista, parece que sería una buena forma de estructurar una aplicación_. – Emerson

Cuestiones relacionadas