2012-01-31 15 views
5

Pracuję nad aplikacją backbone.js i osiągnąłem punkt, w którym mam wiele routerów i widoków reprezentujących każdą część mojej aplikacji. W poniższym przykładzie uproszczonego routera mam dwie lokalizacje; account & users.Czyszczenie widoków za pomocą pliku backbone.js?

Oba widoki w każdej lokalizacji powodują, że ich treść jest elementem wzajemnym, nazwanym #appcontainer. Mój zdrowy rozsądek mówi, że powinienem się upewnić, że każdy widok przed uruchomieniem kolejnej uniemożliwi kolizje w wiązaniach, DOM i tym podobne.

Ale ponieważ nie wiem na pewno, czy widok został już utworzony, nie mogę jednoznacznie zadzwonić pod numer previousView.remove() z poziomu routera lub widoków.

Czy wystarczy dodać $(this.el).empty() do konstruktora każdego widoku, aby wyczyścić wszelkie wcześniejsze wiązania i elementy z DOM?

Oto przykład routera?

var myRouter = Backbone.Router.extend({ 

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

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

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

}); 

Odpowiedz

11

Mam bardzo prostą implementację, jestem dopiero zaczyna mój wniosek i teraz nie wiem jak to będzie trzymać się na dłuższą metę, ale wygląda mniej więcej tak:

Edytuj: Oto, jak powinien wyglądać cały plik. this.render będzie kolejną funkcją 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

Witam! Dzięki za odpowiedź. Czy metoda '.remove()' metody jQuery oddziela się od szkieletów '.remove()' w widokach? – Industrial

+2

Backbone's .remove() to po prostu alias dla jquery's .remove(), więc dla tych celów są one równe. – MrGrigg

+1

@MrGrigg ** Czy możesz wyjaśnić, gdzie pójdzie metoda renderowania? Wygląda na to, że trafia do samego routera, ale chcę się upewnić ... ** _I naprawdę podoba mi się wygląd tego kodu i na pierwszy rzut oka wygląda na to, że byłby to dobry sposób na skonstruowanie aplikacji. – Emerson

Powiązane problemy