2012-06-06 8 views
10

ich haben will umleiten jede Seite Anfrage an meine index.html, und jeder Link (nicht #urls -/real/Urls) geklickt in meiner app durch router.js so gibt es im Wesentlichen keine Seite laufen erfrischt - rein ajax. Gibt es eine einfache Möglichkeit, dies mit Backbone Routing und Htaccess zu tun?Backbone-Router arbeitet nicht mit pushstate

Ich habe es im Moment funktioniert, wenn ich {pushState: true} wegnehmen und meine Links wie #login formatieren. Wenn ich jedoch pushState aktiviere und auf #login klicke, passiert nichts. Stattdessen ist es nur einmal, wenn ich die Seite aktualisiere, dass Backbone die #login interpretiert und der Route folgt, um loginView zu rendern.

Hier ist mein Router:

// 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 
    }; 
}); 

Was möchte ich in requestInviteView ist geschehen, wenn der Link auf /login geklickt wird, wird die URL Änderungen /login und die loginView gemacht wird.

Danke für jede Hilfe!

Antwort

10

Der Wechsel von Hash- zu Pushstate ist nicht so trivial wie das Ändern einzelner Parameter, wie man denken könnte. Was ich mache, ist das Klickereignis in meiner Ansicht zu erfassen und app.navigate aufzurufen, um die Route auszulösen.

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

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

+0

du automatisch ein ähnliches Verfahren wie [dieser Kern] mit etwas tun kann (https : //gist.github.com/colllin/5717284). – colllin

5

Obwohl Anthony Antwort funktionieren wird, trigger: true verwendet, ist in der Regel nicht die beste Vorgehensweise. Stattdessen sollte Ihre App so strukturiert sein, dass Sie navigate mit dem Standard trigger Wert links auf false aufrufen können.

Derick Bailey spricht über das Thema in seinem Blog bei http://lostechies.com/derickbailey/2011/08/28/dont-execute-a-backbone-js-route-handler-from-your-code/ (Absatz "Der‚AHA!‘Moment In Bezug auf Router.Navigate Der zweite Argument")

Zusätzlich ist ein ganzes Kapitel näher erläutert Routing (einschließlich warum Sie sollten trigger zu false) verlassen können kostenlos in diesem pdf Buch Probe dowloaded werden: http://samples.leanpub.com/marionette-gentle-introduction-sample.pdf (vollständige Offenlegung: ich bin der Buchautor)

+1

interessant, aber die Logik für jeden Controller zu replizieren, nur um einen zweiten Parameter zu vermeiden, erscheint redundant. Ich habe seltene Szenarien, in denen ich das benutze (dh wenn eine Route angefordert wird außer Betrieb ändere ich es im laufenden Betrieb und render die richtige Ansicht). Der Kontext dieser Frage besteht darin, eine Aktion auszulösen, nachdem eine Verknüpfung angeklickt wurde, und ich sehe, dass ich sie als das Beste austrage. – Garrett