Mehrere Ansichten auf einer Seite mit Verlauf in AngularJS mit Angular UI Router

8

In meiner AngularJS-App habe ich eine About-Seite mit mehreren Unterabschnitten. Alle diese Unterabschnitte befinden sich auf derselben Seite und Teil derselben Vorlage. Ich möchte jedoch über die eigene URL auf jeden Abschnitt zugreifen, der bei Übereinstimmung mit dem richtigen Abschnitt herunterscrollt.

Ich habe die Zustände so eingerichtet:

%Vor%

Und auf der About-Seite habe ich ein Menü wie:

%Vor%

Dieses Menü ist unten festgelegt und wenn der Benutzer auf den Link klickt oder wenn er die URL direkt über die Adressleiste aufruft, sollte er zu diesem Abschnitt blättern (die URL muss dort aktualisiert werden, wo sie übereinstimmen muss).

Ich bin mir jedoch nicht sicher, wie ich das machen soll (via Angular). Zusammenfassend:

  1. Wie kann ich über die URL zu den verschiedenen Bereichen auf derselben Seite scrollen? Da ich den Standard-Hash-Trick nicht verwenden kann, verwendet er bereits Hashes für die Adresse (wir unterstützen IE8). Und ich möchte im HTML5-Modus überhaupt keine Hashes verwenden! Es sollte auch zu dem Abschnitt auf der Seite geladen werden, nachdem die App geladen wurde, also müssen Sie den Code, der den Benutzer scrollt, nach etwas anderem abfeuern ...
  2. Wie kann ich das mit einem Klick auf die Buttons machen? Beim Klicken auf die Schaltflächen ändern sie derzeit die URL, aber scrollen nicht zum Inhalt.

Der HTML-Code für die Seite sieht folgendermaßen aus: Ссылка

Sie können die App hier sehen: Ссылка

Für ein Beispiel von etwas ähnlichem ( Ссылка ), wie Sie sehen können, scrollt es nach unten zu dem richtigen Abschnitt auf der Grundlage der URL NACH dem Laden der Seite ... und verwendet keinen Hash, sondern die tatsächliche URL.

    
Cameron 28.08.2014, 10:43
quelle

8 Antworten

2

Sie können diesen Ansatz versuchen, indem Sie eine Direktive erstellen, die den Scroll beim Klicken auslöst. Sie können diese Anweisung als Attribut zu Ihrer Verknüpfung hinzufügen. wobei das Attribut sref die ID des Zieldivs ist.

%Vor%

Plunker

    
samir 02.09.2014 08:46
quelle
2

Der UI-Router stellt keine Einschränkungen für die Signatur Ihres Statusobjekts, sodass Sie einfach eine Eigenschaft hinzufügen können:

%Vor%

Dann kann Ihr Controller auf diese Daten zugreifen, wenn Sie den Dienst $ state einspeisen.

%Vor%

unter der Annahme, dass Sie die id="divAboutOffice" in Ihren HTML-Code eingefügt haben. (und angenommen, dass meine jQuery-Referenz korrekt war; ich benutze keine jquery, also bin ich mir nicht sicher.) Abhängig von Ihren Anforderungen würden Sie dieses animate() in ein $on() für eines der Ereignisse einbinden: $locationChangeSuccess) , $routeChangeSuccess oder $stateChangeSuccess

auch: Sie müssen nicht die "id" verwenden, wie ich habe - Sie könnten die vorhandene ui-sref nutzen, wenn Sie wirklich nach Elementen nach Attribut suchen möchten. In Ihrem Beispiel scheint dies mit $state.current.name

übereinzustimmen     
bcombs 05.09.2014 02:10
quelle
0

Ich würde eine scrollTo-Direktive mit window.scrollTo oder einem jquery scrollTo-Plugin erstellen.

Beispiel: Angular-Anweisung, um zu einem bestimmten Element zu blättern Verwenden von window.scrollTo

Jquery scrollTo Plugins:

Ссылка

Ссылка

Beim Laden der Seite scrollen Sie zu der Ansicht, die durch den Hashtag oder einen anderen URL-Parameter definiert wird. Beispiel: www.sample.com # aboutUs Oder www.samplecom? view = aboutUs

    
edi spring 28.08.2014 10:57
quelle
0

beim Scrollen sollte ich:

%Vor%

(nachdem ich diese Header zu einer Direktive gemacht habe. (Ich sollte Header zu einer Direktive machen, überprüfe, wie das Inhaltsverzeichnis von ngtutorial.com/learn/scope generiert wird)

%Vor%

beim Laden (ich bevorzuge Hashtags, da ich einfach $ anchorScroll () verwenden oder .when () verwenden kann), Beispiele für die Aktualisierung beim Laden sind:

%Vor%

Wenn Sie Hashtags nicht mögen, können Sie location.url ()

parsen     
Noypi Gilas 02.09.2014 09:09
quelle
0

Ich benutze Ссылка in meiner eigenen Anwendung, um Scroll-Kontrolle (und scrolle Spion-Zeug) zu machen, anstatt locationHash zu benutzen. Ich habe diese Lösung nicht selbst ausprobiert, aber ich denke, es wird funktionieren.

Du solltest eine Art Item-ID für wichtige divs deklarieren (um der Ort zu sein, an den du scrollst).

Dann können Sie einen Zustand "about.stately" mit einer URL / about /: locale deklarieren (in ui-router stateParams müssen keine Ganzzahlen sein). Dann in der Steuerung für ungefähr. Können Sie tun (aus der eckigen Scroll-Readme):

%Vor%

Wählen Sie anhand des $ stateParams.locale in Ihrem Controller aus, zu welchem ​​Element Sie scrollen möchten. Seien Sie vorsichtig, bis nach all Ihren Kinddirektiven und Stuff Loads - Sie müssen möglicherweise $ evalAsync um es richtig funktionieren zu lassen. Aber das ist der Kern davon, denke ich.

    
pfooti 03.09.2014 05:00
quelle
0

Das habe ich im Moment versucht:

%Vor%

Wie Sie sehen können, höre ich den stateChangeSuccess anstelle von Klicks! Auf diese Weise hake ich in jeden Zustand Änderungen unabhängig davon, ob sie von Links oder Browser-Verlauf Tasten aufgerufen wurden und führen Sie den Bildlauf wie nötig.

Ich blende Scrollspy aus, sobald eine Startänderung beginnt, so dass die Scrolling-Animation keine andere Statusänderung aufruft (da es möglich ist, dass Sie durch andere Sektionen scrollen, die gefälschte History-Einträge erzeugen). Und dann schalten Sie es wieder ein, wenn die Animation abgeschlossen ist, damit ich wieder auf Scroll-Ereignisse warten kann.

stateChangeSuccess wird beim Laden der Seite ausgelöst, so dass jedes Einfügen von URLs behandelt wird.

Ich habe eine Variable mit dem Namen scrolled , so dass ich verfolgen kann, ob eine Statusänderung durch das Scrollen des Benutzers verursacht wurde oder nicht. Dies liegt daran, dass ich den scrollTop nicht animieren muss, während der Benutzer durch die Bildlaufleiste geblättert hat.

Gedanken?

    
Cameron 03.09.2014 13:10
quelle
0

Was Sie tun müssen, ist eine Anweisung oben auf der Seite neben dem UI-Router zu erstellen, der den Status überwacht und dann entsprechend dem richtigen Anker scrollt. Es besteht keine Notwendigkeit, templateUrls zu verwenden, da das, was Sie zu erreichen versuchen, eine Art Glättung ist.

    
Gepsens 03.09.2014 15:04
quelle
-1
%Vor%     
BitMan 03.09.2014 12:10
quelle