2012-06-06 8 views
10

chcę mieć każde żądanie strony przekierować do mojego index.html, a każdy związek (nie #urls -/prawdziwych/URL) kliknięciu w mojej aplikacji do uruchomienia przez router.js więc istnieją zasadniczo ma stron odświeża - czysto ajax. Czy istnieje prosty sposób, aby to zrobić za pomocą routingu Backbone i htaccess?Backbone Router nie działa z pushState

Mam to działa w tej chwili, jeśli zabiorę {pushState: true} i sformatować moje linki jak #login. Jednak po włączeniu pushState i kliknięciu na #login nic się nie dzieje. Zamiast tego, tylko raz odświeżam stronę, którą Szkielet interpretuje #login i podąża za trasą do renderowania loginView.

Oto mój ruter:

// Filename: router.js 
define([ 'views/beta/requestInvite', 'views/beta/login' ], 
function(requestInviteView, loginView) { 
    var AppRouter = Backbone.Router.extend({ 
     routes : { 
      // Pages 
      'login' : 'login', 

      // Default 
      '*actions' : 'defaultAction' 
     }, 

     // Pages 
     login : function() { 
      loginView.render(); 
     }, 

     defaultAction : function(actions) { 
      requestInviteView.render(); 
     } 
    }); 

    var initialize = function() { 
     var app_router = new AppRouter; 
     Backbone.history.start({pushState: true}); 
    }; 
    return { 
     initialize : initialize 
    }; 
}); 

Jakie chciałbym się zdarzyć jest w requestInviteView, gdy link do /login kliknięciu zmienia URL do /login i loginView jest renderowane.

Dzięki za pomoc!

Odpowiedz

10

Zmiana z hash na pushstate nie jest tak trywialna, jak zmiana pojedynczego parametru, ponieważ można skłonić do myślenia. Co zrobić, to złapać zdarzenie click w moim widoku i wywołać app.navigate, aby uruchomić trasę.

app.navigate("/login", {trigger: true}); 

http://backbonejs.org/#Router-navigate

+0

można to zrobić za pomocą niejako automatycznie metodę podobną do [ta istota] (https : //gist.github.com/colllin/5717284). – colllin

5

Chociaż odpowiedź Antoniego będzie działać, korzystając trigger: true nie jest zwykle najlepszym sposobem działania. Zamiast tego Twoja aplikacja powinna mieć strukturę, dzięki czemu możesz zadzwonić pod numer navigate z domyślną wartością trigger do false.

Derick Bailey mówi o problemie na swoim blogu w http://lostechies.com/derickbailey/2011/08/28/dont-execute-a-backbone-js-route-handler-from-your-code/ (pkt "The«AHA!»Moment chodzi Router.Navigate za drugi argument")

Ponadto, cały rozdział wyjaśniający routing bardziej szczegółowo (w tym dlaczego należy pozostawić trigger do false) można dowloaded za darmo w tej próbce pdf book: http://samples.leanpub.com/marionette-gentle-introduction-sample.pdf (pełne ujawnienie: Jestem autor książki)

+1

interesujące, ale powielenie logiki dla każdego kontrolera, aby uniknąć drugiego parametru, wydaje się zbyteczne. Mam rzadkie scenariusze, w których używam tego (tj. gdy trasa jest żądana poza kolejnością, zmieniam ją w locie i wyświetlam odpowiedni widok). kontekstem tego pytania jest wywołanie działania po kliknięciu łącza i zobaczenie jego uruchomienia jako najlepszego. – Garrett