2012-12-10 11 views
10

Ich habe ein merkwürdiges Problem, das ich bisher nicht herausfinden konnte. Es ist sehr einfach, was wahrscheinlich ist, warum Ich habe Probleme mit ihmBackbone-Routen, die nicht aufgerufen werden

zuerst :), hier ist die Routing-Tabelle ...

routes: { 
    '': 'root', //called 
    'report': 'report', // called 
    'report/add': 'reportAdd', // not called 
    'report/print': 'reportPrint', // not called 
    'report/settings': 'reportSettings', // not called 
}, 

Sie werden sehen, ich markiert, die diejenigen arbeiten und welche aren t. Das Problem läuft darauf hinaus, dass alle Unterrouten (d. H. report/add) nicht übereinstimmen.

Backbone Geschichte richtig in main.js wie so genannt:

app.Router = new Router(); 
Backbone.history.start({ pushState: true }); 

Offensichtlich, dass an der richtigen Stelle ist, weil Routen sind nicht nur Teilrouten arbeiten. Ich habe die root Optionen von Backbone.history und die Stille parameter alles ohne Glück versucht.

Ich stelle mir vor, es ist ein Konfiguration/Setup-Problem, aber ich konnte keine Antworten finden. Was mache ich falsch? Jede Hilfe wird sehr geschätzt.

Btw, ich benutze requirjs und Backbone Boilerplate, aber ich sehe nicht, wie das einen Unterschied machen würde.

UPDATE: Obwohl die Antwort technisch korrekt ist, ist das Problem mit Backbone Boilerplate. Eine Erläuterung hierzu finden Sie am Ende dieser blog post. Ich habe das gleiche Problem wie der erste Kommentator dort.

+2

Das sollte gut funktionieren (http://jsfiddle.net/ambiguous/stBVC /), was machst du, dass die Geige nicht ist? –

+2

Die stinkende "PushState" -Option war das Problem. Jetzt habe ich Hashes (# Bericht/hinzufügen) URLs, aber es funktioniert. Wie entferne ich die Hash-URLs und verwende pushState? – Brandon

Antwort

10

Wie in den Kommentaren erläutert, besteht das Problem darin, dass der Server bei Verwendung von URLs im Push-Status-Stil die Backbone-Routen-URLs nicht erkennt.

Zur Veranschaulichung sagen Sie, dass das Stammverzeichnis Ihrer Anwendung server/app/index.html ist und Sie versuchen, eine URL zu verwenden, die Backbone an /report/print routet. Mit URL Fragment Routing, das ist in Ordnung:

http://server/app/index.html#report/print 

Der Server den Teil nach # und kehrt index.html ignoriert; dann laden Sie Backbone-Routen zu report/print.

Aber wenn Sie mit Push-Zustand Routing, dann sieht die URL wie folgt aus:

http://server/app/index.html/report/print 

und der Server führt einen 404-Fehler, weil es nichts auf diesem Weg nicht erkennt, so Backbone wird nie sogar geladen.


Die Lösung ist entweder:

  1. Als Backbone.js docs Notiz, Server-Code ändern, so dass der Server den richtigen Inhalt für jede Backbone Route oder
  2. (was ich denke, macht einfacher) setzen Sie eine URL Neuschreiben auf dem Webserver (IIS, Apache), so dass es index.html für jede Anfrage zurückgibt, die eine Backbone-Route wie index.html/report/print, index.html/report/add usw. ist.

In IIS, zum Beispiel, würden Sie die folgende in der web.config unter Anwendungsroot setzen:

<rewriteMaps> 
    <rewriteMap name="StaticRewrites"> 
     <add key="index.html/report/print" value="index.html" /> 
     <add key="index.html/report/add" value="index.html" /> 
     <!-- etc --> 
    </rewriteMap> 
</rewriteMaps> 
Verwandte Themen