2015-01-24 2 views
19

Dies ist meine erste Erfahrung mit AngularUI Router, also schätze ich, dass ich einen Anfängerfehler mache und hoffe, dass mich jemand führen kann.Wie bekomme ich Angular UI Router um "nicht geroutete" URLs zu erhalten?

Ich habe eine einseitige Anwendung für die Verwendung von Angular UI Router im HTML5-Modus konfiguriert, und alles scheint wie erwartet zu funktionieren.

.config([ 
    "$stateProvider", "$urlRouterProvider", "$locationProvider", 
    function ($stateProvider, $urlRouterProvider, $locationProvider) { 
     $stateProvider.state("concept", { 
      url: "/concepts/:conceptKey", 
      templateUrl: "/templates/concept-view.html", 
      controller: "conceptViewController", 
      resolve: { 
       concept: [ 
        "$stateParams", "conceptsApi", 
        function ($stateParams, conceptsApi) { 
         return conceptsApi.getConcept($stateParams.conceptKey); 
        } 
       ] 
      } 
     }); 

     $urlRouterProvider.otherwise("/"); 

     $locationProvider.html5Mode(true); 
    } 
]) 

Die gleiche Seite enthält jedoch auch einige Links zu anderen statischen Seiten auf der gleichen Website mit relativen URLs. Vor der Installation von Angular Routing funktionierten diese Links korrekt, aber jetzt sind sie gebrochen. Insbesondere wird durch Klicken auf einen dieser Links die Adressleiste des Browsers korrekt geändert, aber die Navigation zu dieser Zielseite wird nicht ausgelöst.

Ich nehme an, ich muss etwas hinzufügen, um der Routing-Konfiguration zu sagen, bestimmte URL-Muster zu ignorieren, aber ich habe keine Informationen gefunden, die mir zeigen, wie das geht. Irgendwelche Vorschläge bitte?

Danke, Tim

+0

Es scheint, dass Ihre Serverseite nicht gut konfiguriert ist. Wie auch immer, überprüfe [diesen Link mit example/plocker] (http://stackoverflow.com/a/26009350/1679310) von UI-Router und html5. Wenn der Server gut konfiguriert ist, sollte das auch funktionieren. –

+0

Danke für Ihren Vorschlag, aber ich sehe nicht, wie dies für meine Situation gilt. UI-Routing funktioniert ordnungsgemäß für URLs, die der definierten Statuskonfiguration entsprechen, verhindert jedoch die Navigation zu einer statischen Seite in derselben Domäne. Wenn ich diese statische Seite direkt von einer neuen Browser-Registerkarte anfordere, wird sie korrekt gerendert, und ebenso, wenn ich das Routing deaktiviere. Das Problem tritt nur auf, wenn das Routing aktiv ist, wobei alle Verbindungen innerhalb des SPA, die auf Seiten außerhalb des SPA ausgerichtet sind, unterbrochen sind. –

+0

Ich denke, ich sehe jetzt.Dann (wenn ich Ihr Problem verstehe) würde ich sagen, dass Sie nur Ihren Serverteil ändern müssen. Ich benutze ASP.NET MVC ... und das ist ein Ort, an dem ich einstellen kann, wie der SERVER auf eine beliebige URL reagiert. Einige werden auf index.html umgeleitet ... einige werden wie erwartet bedient. Überprüfen Sie es dort ... (Link, wie das in MVC http://Stackoverflow.com/a/27707238/1679310) –

Antwort

36

Nach einigen Untersuchungen entdeckte ich, dass dieses Problem nicht speziell auf Angular UI-Router verbunden ist. Das gleiche Verhalten ist auch im nativen AngularJS-Routing-Mechanismus vorhanden und wird durch die von $location implementierte Link-Neuschreiblogik verursacht, wie in this documentation beschrieben.

Weitere Erörterung des Problems ist here.

fand ich zwei mögliche Lösungen, die beide scheinen gut zu funktionieren:

Explizit Links zu statischen Seiten zielen: das Attribut target="_self" in allen Links zu statischen Seiten (dh Seiten Durch die Einbindung, die außerhalb des definierten fallen Angular Routing-Schema) werden sie von AngularJS ignoriert und somit korrekt gerendert.

Link zum erneuten Schreiben deaktivieren: Beim Konfigurieren von Angular Routing im HTML5-Modus werden zwei Syntaxformate unterstützt. Das einfachste Format ...

$locationProvider.html5Mode(true);

... ermöglicht HTML5-Modus mit der Standardkonfiguration. Jedoch stellt die Langform Syntax Zugriff auf zusätzliche Konfigurationseigenschaften, von denen löst das obige Problem durch Angular Standardverhalten des Abfangens und Umschreiben Link-URLs zu deaktivieren:

$locationProvider.html5Mode({ 
    enabled: true, 
    requireBase: false, 
    rewriteLinks: false 
}); 

ich die zweite Lösung verwendet, und es erscheint keine nachteiligen Auswirkungen auf das Verhalten von URLs haben, die im Routingschema definiert sind. Diese Lösung scheint mit Angular UI Router und mit nativem AngularJS-Routing gleich gut zu funktionieren.

+0

Mit der ersten Option müssen Sie zu allen Ihren Links hinzufügen "target =" _ self "aber Sie haben die Möglichkeit zu wählen, ob ein Link die URL ändern wird oder es wird auf diese URL umgeleitet ... der zweite. ... muss nicht alle Ihre Links ändern ... aber Sie können nicht die 2 verschiedenen Arten von Links wählen .... richtig? – Michalis

+0

@Michalis Ja, der erste Ansatz bietet feinere Kontrolle über das Verhalten Der zweite Ansatz implementiert das gleiche Verhalten global, erlaubt aber nicht die flexible Konfiguration des Linkverhaltens selbst. –

+0

Zwei weitere Lösungen aus der '$ location'-Dokumentation - Angular schreibt die URL auch nicht neu Wenn es sich um eine absolute URL handelt, die in eine andere Domäne geht oder wenn die URL mit "/" beginnt und zu einem anderen Basispfad führt. – adam0101

Verwandte Themen