Wie mische ich Links, die Seitenaktualisierungen auslösen, mit Angulars html5Mode = true, ohne die Zurück-Schaltfläche zu unterbrechen?

8

Ich gehe durch den problematischen Fluss ...

  • Ich lade google.com (nur als Ausgangspunkt)
  • Ich gehe app.com
  • Ich navigiere zu app.com/projects
  • Ich navigiere zu app.com/api/test (über window.location)
  • Ich sehe das rohe JSON (gut so weit ...)
  • Ich drücke zurück, URL ändert sich zu app.com/projects , aber ich sehe immer noch das JSON.
  • Ich drücke wieder zurück, URL ändert sich zu app.com , aber ich sehe immer noch den JSON.
  • Ich drücke erneut, google.com lädt.
  • Ich drücke vorwärts, app.com lädt gut ... alles wieder normal

Was ist seltsam, habe ich das nur beobachtet, wenn html5Mode = true in Webkit- Firefox wie gewünscht funktioniert ...

. . .

Zuerst sieht mein server.coffee so aus:

%Vor%

Im Grunde laden alle Anfragen den Index (mit dem Bootstrang Angular) mit Ausnahme für einen View / Partial-Handler und eine Test-API-Route, die mit Raw JSON antwortet.

. . .

(Ich verwende das Modul ui-router zur Verwaltung von verschachtelten Sichten und UI-Zuständen; es verwendet $urlRouterProvider , was Angulars $routeProvider ) sehr ähnlich ist

Zweitens sieht mein app.coffee so aus:

%Vor%

Da alles asynchron ist, musste ich $window verwenden, um auf window.location.href zuzugreifen, um eine Seitenaktualisierung auszulösen, damit der Server die Route handhaben kann.

Also meine Frage, kann ich Links, die Seitenaktualisierungen auslösen, mit Angulars html5Mode mischen, ohne die Zurück-Schaltfläche zu brechen? Ist das nur ein Webkit Bug und / oder gibt es einen besseren Weg dies zu tun?

Im Idealfall würde die Anwendung von Angular ausgeführt werden, aber Dinge wie die "Über" - oder "Kontakt" -Seite (die nicht dynamisch oder asynchron sein müssen) würden direkt vom Server über normale Seitenaktualisierungen geliefert ...

Hilfe!

    
jlmakes 02.05.2013, 11:09
quelle

1 Antwort

18

Zwei Optionen:

  1. Wenn Sie <a /> -Tags verwenden, geben Sie target="_self" an, um AngularJS mitzuteilen, dass sie ihre Klicks nicht erfassen sollen (diese Links werden normalerweise vom Browser verarbeitet). Dies ist kein Hack; Das ist normal dokumentiertes Verhalten.
  2. Benutze $window.location = 'foo' wie du es gemacht hast. Das ist akzeptabel.
Ezekiel Victor 03.05.2013, 09:22
quelle