Erhalten Sie traditionelles Ankerverhalten mit ng-include

8

Ich entwickle keine einseitige Anwendung, sondern eine "traditionelle" Seite, die AngularJS an einigen Stellen verwendet. Ich habe das folgende Problem (mit 1.3.0-Beta.6) getroffen:

Standard, funktionierende Ankerlinks:

%Vor%

Das funktioniert gut. Jetzt stelle ich irgendwo eine Vorlage vor:

%Vor%

welches aufgerufen wird über:

%Vor%

Das Teil ist korrekt enthalten, aber der Ankerlink funktioniert nicht mehr. Ein Klick auf "Text verknüpfen" ändert nun die angezeigte URL in /#/foo anstatt /#foo und die Seitenposition ändert sich nicht.

Ich verstehe, dass die Verwendung von ng-include Angular implizit mitteilt, dass ich das routes-System verwenden und das native Ankerverknüpfungsverhalten des Browsers außer Kraft setzen möchte. Ich habe Empfehlungen gesehen, um dies zu umgehen, indem ich meine HTML-Anchor-Links zu #/#foo ändere, aber das kann ich aus anderen Gründen nicht tun.

Ich habe nicht vor, das routes-System zu verwenden - ich möchte einfach ng-include verwenden, ohne dass es mit dem Verhalten des Browsers zu tun hat. Ist das möglich?

    
shacker 25.04.2014, 18:00
quelle

5 Antworten

2
  

Ich verstehe, dass die Verwendung von ng-include Angular implizit mitteilt   dass ich das routes System benutzen möchte und den Browser überschreibt   natives Ankerverknüpfungsverhalten. Ich habe Empfehlungen zum Arbeiten gesehen   dies, indem ich meine HTML Anker Links zu # / # foo, aber ich kann das nicht tun   aus anderen Gründen.

Das Routing-System ist in einem separaten Modul ngRoute definiert. Wenn Sie es also nicht selbst injiziert haben - und ich bin mir ziemlich sicher, dass Sie es nicht getan haben - ist es überhaupt nicht zugänglich.

Das Problem ist hier irgendwie anders.

ng-include hängt ab von: $http , $templateCache , $anchorScroll , $animate , $sce . Verwenden Sie also ng-include , um alle diese Dienste zu initiieren.

Der natürlichste zu untersuchende Kandidat wäre $anchorScroll . Der Code von $anchorScroll scheint dies nicht zu tun schaden, aber der Dienst hängt von $window , $location , $rootScope ab. Die Zeile 616 von $location sagt:

%Vor%

Im Grunde genommen wird der Basis-href auf '' gesetzt, wenn er vorher nicht gesetzt wurde.

Sehen Sie sich HIER an - aus der Antwort von BalusC :

  

Wie benannte Anker mögen, mit dem Tag   Sie erklären im Grunde alle relativen Links dazu,   einschließlich benannter Anker. Keiner der relativen Links ist relativ zu   der aktuelle Anfrage - URI (wie es ohne den   Tag).

Wie kann das Problem gemildert werden?

Ich habe heute nicht viel Zeit, kann es also nicht selbst testen, aber was ich als erste Option prüfen möchte, ist, sich an '$ locationChangeStart' Ereignis und wenn die neue URL vom Typ #xxxxxx ist, verhindern Sie einfach das Standardverhalten und scrollen Sie stattdessen nach mit $anchorScroll nativen Methoden.

Aktualisieren

Ich denke, dass dieser Code die Arbeit machen sollte:

%Vor%     
artur grzesiak 25.04.2014, 19:31
quelle
6

Der Grund dafür ist, dass angular das Verhalten von Standard-HTML-Tags außer Kraft setzt, die auch <a> enthalten. Ich bin mir nicht sicher, wann diese Änderung passiert ist, weil angular v1.0.1 damit gut funktioniert.

Sie sollten das href-Attribut durch ngClick als ersetzen:

%Vor%

Und in einer Steuerung so:

%Vor%

Demo: Ссылка

Oder verwenden Sie einfach Doppel-Hash als:

%Vor%

Demo: Ссылка

Update: Ich wusste nicht, dass Sie keine Änderung in HREF wollen. Sie können jedoch immer noch das gewünschte Ergebnis erzielen, indem Sie die vorhandene a -Direktive überschreiben:

%Vor%

Demo: Ссылка

    
codef0rmer 25.04.2014 19:07
quelle
2

Dies ist die beste Lösung und funktioniert in neueren Versionen von Angular:

Deaktivieren Sie die URL-Manipulation in AngularJS

    
Kohjah Breese 06.12.2015 01:26
quelle
2

Viel zu spät zur Party, aber ich fand, dass das Hinzufügen eines einfachen Ziels="_ self" es behebt.

%Vor%     
Motoman Mick 01.04.2016 04:38
quelle
1

Anstatt die winkelförmige Anwendung auf die gesamte Seite anzuwenden, können Sie die Anwendung nur auf die Stellen isolieren, an denen Sie ng-include ausführen möchten. Dadurch können Links, die nicht in den Anwendungsbereich der Anwendung fallen, ihre normale Funktionalität beibehalten, während Links innerhalb der Anwendung wie gewünscht gehandhabt werden können.

Sieh diesen Plunkr:

Zypern

Der Plunkr zeigt einen Link außerhalb der App, der wie normal funktioniert, und einen Link innerhalb der App, der mit einer überschreibenden a -Direktive behandelt wird, um die normale Funktionalität wiederherzustellen. Im HTML5-Modus können Standard-URLs (statt "Hashbang" -URLs) beibehalten werden.

Sie könnten auch die ganze Seite innerhalb der App laufen lassen, aber ich dachte, es wäre in jedem Fall sinnvoll, zu demonstrieren, wie man Winkel zu bestimmten Teilen der Seite isoliert.

    
mjtko 26.04.2014 18:26
quelle

Tags und Links