Chciałbym dodać kilka linków na mojej stronie Angular2, które po kliknięciu będą przeskakiwać do określonych pozycji na tej stronie, tak jak robią to zwykłe hashtagi. Więc linki wyglądałyby tak
/users/123#userInfo
/users/123#userPhoto
/users/123#userLikes
itp.
Wydaje mi się, że nie potrzebuję HashLocationStrategy, ponieważ nie przeszkadza mi normalny sposób Angular2, ale jeśli dodam bezpośrednio, link faktycznie przeskoczy do katalogu głównego, a nie gdzieś na tej samej stronie. Każdy kierunek jest doceniany, dzięki.
123
jest w pytaniu) przy założeniu, że ścieżka trasy oczekuje parametru takiego jak{ path: 'users/:id', ....}
01
lub100
nie są one prawidłowymi selektorami CSS. Możesz dodać literę lub coś, co sprawi, że będzie to prawidłowy selektor. Tak więc nadal przechodziłbyś01
jako fragment, aleid
musiałoby to być coś podobnego,d01
a zatemdocument.querySelector('#d'+id)
pasowałoby.Chociaż odpowiedź Güntera jest poprawna, nie obejmuje ona części dotyczącej „skoku do” znacznika kotwicy .
Dlatego dodatkowo do:
... w komponencie (nadrzędnym), w którym potrzebujesz zachowania „przejdź do”, dodaj:
Należy pamiętać, że jest to obejście ! Śledź ten problem na githubie, aby uzyskać przyszłe aktualizacje. Podziękowania dla Victora Savkina za dostarczenie rozwiązania!
źródło
"['../faq']"
jako wartość, w przeciwnym razie spróbuje przejść do / faq / faq / # anchor, insteaf of / faq / # anchor. Czy to jest właściwy sposób, czy też istnieje bardziej elegancki sposób odnoszenia się do bieżącej strony w routerze? Ponadtodocument.querySelector("#" + tree.fragment);
daje mi nieprawidłowy błąd selektora. Czy jesteś pewien, że to prawda? Dziękuję<a [routerLink]="['/faq']" fragment="section6">
?Przepraszam, że odpowiedziałem trochę późno; W dokumentacji Angular Routing znajduje się predefiniowana funkcja, która pomaga nam w routingu z hashtagiem do kotwicy strony, tj. AnchorScrolling: 'enabled'
Krok 1: - Najpierw zaimportuj RouterModule do pliku app.module.ts: -
Krok 2: - Przejdź do strony HTML, utwórz nawigację i dodaj dwa ważne atrybuty, takie jak [routerLink] i fragment w celu dopasowania odpowiednich identyfikatorów Div : -
Step-3: - Utwórz sekcję / div, dopasowując nazwę ID do fragmentu : -
W celach informacyjnych dodałem poniższy przykład, tworząc małe demo, które pomaga rozwiązać problem.
źródło
scrollPositionRestoration: 'enabled',
opcję pod zakotwiczeniem Przewijanie :)Trochę późno, ale oto odpowiedź, którą znalazłem, która działa:
A w komponencie:
Powyższe nie przewija się automatycznie do widoku, jeśli wylądujesz na stronie z kotwicą, więc użyłem powyższego rozwiązania w moim ngInit, aby to również działało:
Pamiętaj, aby zaimportować Router, ActivatedRoute i NavigationEnd na początku komponentu i wszystko powinno być gotowe.
Źródło
źródło
document.querySelector ( "#" + f )
daje mi błąd, ponieważ oczekuje selektora, a nie łańcucha.element.scrollIntoView()
(bez przechodzeniaelement
do funkcji). Aby ją gładką, użyj tego:element.scrollIntoView({block: "end", behavior: "smooth"})
.onAnchorClick()
musimy zdać logiczną do scrollIntoView:if (element) { element.scrollIntoView(true); }
. Teraz mogę dwukrotnie kliknąć ten sam link i przewijać praceŻadna z poprzednich odpowiedzi nie działała dla mnie. W ostatnim wysiłku spróbowałem w moim szablonie:
Z tym w moim .ts:
I działa zgodnie z oczekiwaniami w przypadku linków wewnętrznych. To faktycznie nie używa tagów kotwicy, więc w ogóle nie dotyka adresu URL.
źródło
Powyższe rozwiązania nie działały dla mnie ... Ten zrobił to:
Najpierw przygotuj się
MyAppComponent
do automatycznego przewijania w ngAfterViewChecked () ...Następnie przejdź do
my-app-route
wysyłaniaprodID
hashtaguźródło
Wszystkie inne odpowiedzi będą działać w Angular w wersji <6.1. Ale jeśli masz najnowszą wersję, nie będziesz musiał robić tych brzydkich hacków, ponieważ Angular rozwiązał problem.
tutaj jest link do wydania
Wszystko, co musisz zrobić, to ustawić
scrollOffset
opcję drugiego argumentuRouterModule.forRoot
metody.źródło
Użyj tego dla modułu routera w
app-routing.module.ts
:To będzie w Twoim HTML:
źródło
W pliku html:
W pliku ts:
źródło
Ponieważ właściwość fragment nadal nie zapewnia przewijania kotwicy, to obejście załatwiło sprawę:
źródło
Dodając do odpowiedzi Kalyoyan , ta subskrypcja jest powiązana z routerem i będzie obowiązywać do pełnego odświeżenia strony. Podczas subskrybowania zdarzeń routera w komponencie należy zrezygnować z subskrypcji w ngOnDestroy:
źródło
Właśnie to działa na mojej własnej stronie internetowej, więc pomyślałem, że warto opublikować tutaj moje rozwiązanie.
A następnie w swoim komponencie upewnij się, że uwzględnisz to:
źródło
element.scrollIntoView()
lubelement.scrollIntoView(true)
. Twoja wersja nie skompilowała się dla mnie (może z powodu surowych NullChecks?).Po przeczytaniu wszystkich rozwiązań szukałem komponentu i znalazłem taki, który robi dokładnie to, o co chodziło w pierwotnym pytaniu: przewijanie do linków zakotwiczenia. https://www.npmjs.com/package/ng2-scroll-to
Podczas instalacji używasz składni takiej jak:
U mnie zadziałało naprawdę dobrze.
źródło
Proste rozwiązanie, które działa w przypadku stron bez parametrów zapytania, jest zgodne z przeglądarką wstecz / dalej, routerami i głębokimi linkami.
Limit czasu to po prostu zezwolenie stronie na załadowanie dowolnych danych dynamicznych „chronionych” przez * ngIf. Można go również użyć do przewinięcia na górę strony podczas zmiany trasy - wystarczy podać domyślny znacznik górnej kotwicy.
źródło
jeśli nie ma znaczenia, aby te identyfikatory elementów były dołączane do adresu URL, powinieneś rozważyć ten link:
Kątowy 2 - Zakotwicz łącza do elementu na bieżącej stronie
źródło
Oto kolejne obejście z odniesieniem do odpowiedzi JavierFuentes:
w skrypcie:
Pozwala to użytkownikowi na bezpośrednie przewinięcie do elementu, jeśli użytkownik trafi bezpośrednio na stronę mającą hashtag w adresie URL.
Ale w tym przypadku subskrybowałem fragment trasy,
ngAfterViewChecked
alengAfterViewChecked()
jest wywoływany w sposób ciągły za każdym razemngDoCheck
i nie pozwala użytkownikowi przewijać z powrotem do góry, więcrouteFragmentSubscription.unsubscribe
jest wywoływany po przekroczeniu limitu czasu 0 milisek po przewinięciu widoku do elementu.Dodatkowo
gotoHashtag
zdefiniowano metodę przewijania do elementu, gdy użytkownik kliknie znacznik kotwicy.Aktualizacja:
Jeśli adres URL ma querystringi,
[routerLink]="['self-route', id]"
w zakotwiczeniu nie zachowa tych zapytań. Próbowałem zastosować obejście tego samego problemu:źródło
Ten działa dla mnie !! Ten ngFor tak dynamicznie zakotwicza tag, musisz poczekać, aż wyrenderują
HTML:
Mój plik ts:
Nie zapomnij, że import
ViewChildren
,QueryList
etc .. i dodać konstruktoraActivatedRoute
!!źródło
W przeciwieństwie do innych odpowiedzi, dodałbym dodatkowo
focus()
wraz zscrollIntoView()
. Używam również,setTimeout
ponieważ przeskakuje na górę w przeciwnym razie podczas zmiany adresu URL. Nie jestem pewien, jaki był tego powód, ale wydaje sięsetTimeout
, że obejście.Pochodzenie:
Miejsce docelowe:
Maszynopis:
źródło
Miałem ten sam problem. Rozwiązanie: użycie View port Scroller https://angular.io/api/common/ViewportScroller#scrolltoanchor
- kod app-routing.module.ts:
- Komponent HTML
- Kod komponentu:
źródło
Właśnie przetestowałem bardzo przydatną wtyczkę dostępną w nmp - ngx-scroll-to , która działa świetnie. Jest jednak przeznaczony dla Angular 4+, ale może ktoś uzna tę odpowiedź za pomocną.
źródło
Wypróbowałem większość tych rozwiązań, ale napotkałem problemy z opuszczeniem i powrotem z innym fragmentem, który nie zadziałał, więc zrobiłem coś innego, co działa w 100% i pozbyłem się brzydkiego hasha w adresie URL.
tl; dr tutaj jest lepszy sposób niż to, co widziałem do tej pory.
źródło