Oto przykładowy układ. Zakładając, że wysokość przekroju jest większa lub równa szerokości widoku użytkownika.Kątowa zmiana stanu routera na przewijanie
+----------+
| Section1 |
+----------+
| Section2 |
+----------+
| Section3 |
+----------+
Wszystkie te sekcje są umieszczone w jednym widoku. Chcę dynamicznie zmieniać adres URL przeglądarki po przewinięciu strony użytkownika i przechodzi do jednej z sekcji: Za pierwszym razem użytkownik widzi http://example.com/#/section1
(kątowo bez trybu html5), a następnie przewija w dół stronę i powinien zobaczyć http://example.com/#/section2
, gdy element stanie się widoczny w oknie roboczym użytkownika . Również jeśli użytkownik kopiuje link, gdy otwiera, tj. http://example.com/#/section2
, muszę przewinąć stronę do tej sekcji.
Aby wykryć, która sekcja jest obecnie oglądana przez użytkownika, używam dyrektywy angular-inview.
Teraz zrobiłem to przez parametr:
$state.go($state.current, {
section: $scope.activeSectionId // e.g. 'section2'
}, {
notify: false, // do not reload page
location: 'replace' // do not save as new history entry
});
Ale w ten sposób nie jest dobry i spokojny url nie szuka przyjaźni. Ma też błąd, gdy klikam na link z ui-srefem, po raz pierwszy przeskakuje na stronę, zmienia sekcję inview na jakiś czas i wyzwala kod wspomniany powyżej, więc w rzeczywistości nie nawiguje zgodnie z ui-sref. Ale następnym razem klikam - wszystko działa dobrze (dzieje się to zaraz po przeładowaniu strony).
Czy ktoś może zasugerować, jak to zrobić lepiej, jeśli to rzeczywiście możliwe?
Użycie zakotwiczonego przewijania nie rozwiąże problemu, aby zmienić stan naturalnego przewijania za pomocą kółka myszy, klawiatury itp. Zmieni się stan tylko po kliknięciu na link lub przycisk. – m03geek
Tak, haszowanie lokalizacji może załatwić sprawę, ale powoduje to kolejny URL w domenie i jeśli przełączyłem się na tryb HTML5, jego hash pozostanie również w url. Moim głównym celem jest zmiana stanu i wreszcie pozbycie się hasha w adresie URL. Ale jak na razie rozumiem, nie da się tego zrobić w jasny sposób, więc jeśli nie pojawią się żadne nowe odpowiedzi, przyjmuję twoje, ponieważ przynajmniej częściowo rozwiązuje to zagadnienie. Dzięki. – m03geek