Czy ktoś z was wie, jak ładnie obsługiwać łączenie skrótów kotwicy w AngularJS ?
Mam następujący znacznik dla prostej strony z najczęściej zadawanymi pytaniami
<a href="#faq-1">Question 1</a>
<a href="#faq-2">Question 2</a>
<a href="#faq-3">Question 3</a>
<h3 id="faq-1">Question 1</h3>
<h3 id="faq-2">Question 2</h3>
<h3 id="fa1-3">Question 3</h3>
Po kliknięciu któregokolwiek z powyższych łączy AngularJS przechwytuje mnie i kieruje na zupełnie inną stronę (w moim przypadku strona 404, ponieważ nie ma tras pasujących do linków).
Moją pierwszą myślą było stworzenie pasującej trasy „ / faq /: rozdział ” i sprawdzenie odpowiedniego kontrolera $routeParams.chapter
po dopasowanym elemencie, a następnie użycie jQuery, aby przewinąć do niego.
Ale potem AngularJS znów sra na mnie i tak czy inaczej przewija do góry strony.
Czy ktoś tutaj zrobił coś podobnego w przeszłości i zna dobre rozwiązanie?
Edycja: Przejście na html5Mode powinno rozwiązać moje problemy, ale i tak musimy wesprzeć IE8 +, więc obawiam się, że nie jest to zaakceptowane rozwiązanie: /
źródło
ng-href=""
zamiast tego sugeruje się użycie kątowe .Odpowiedzi:
Szukasz
$anchorScroll()
.Oto (kiepska) dokumentacja.
A oto źródło.
Zasadniczo po prostu wstrzykujesz go i wywołujesz w kontrolerze, a on przewinie cię do dowolnego elementu z identyfikatorem znalezionym w
$location.hash()
Oto plunker do zademonstrowania
EDYCJA: aby użyć tego z routingiem
Skonfiguruj routing kątowy jak zwykle, a następnie dodaj następujący kod.
a Twój link wyglądałby tak:
Oto Plunker pokazujący przewijanie z routingiem i $ anchorScroll
A jeszcze prostsze:
a Twój link wyglądałby tak:
źródło
<a href="#foo">foo</a>
. Mój przykładowy kod miał pokazywać przewijanie do identyfikatora przy zmianie trasy.$location.search('scrollTo', null)
W moim przypadku zauważyłem, że logika routingu się uruchamiała, jeśli zmodyfikowałem
$location.hash()
. Następująca sztuczka zadziałała ..źródło
$location.hash(my_id); $anchorScroll; $location.hash(null)
. Zapobiega przeładowaniu i nie muszę zarządzaćold
zmienną.Nie trzeba zmieniać żadnego routingu ani niczego innego, czego trzeba użyć
target="_self"
podczas tworzenia łączyPrzykład:
I użyj
id
atrybutu w swoich elementach HTML takich jak:Nie ma potrzeby używania ## jak wskazano / wspomniano w komentarzach ;-)
źródło
źródło
Jeśli zawsze znasz trasę, możesz po prostu dołączyć kotwicę w następujący sposób:
gdzie
route
jest bieżąca trasa kątowa ianchorID
pasuje<a id="anchorID">
gdzieś na stronieźródło
reloadOnSearch: false
tę trasę w konfiguracji tras, kątowy nie spowoduje zmiany trasy i po prostu przewinie do identyfikatora. W połączeniu z pełną trasą określoną wa
tagu powiedziałbym, że jest to najprostsze i najprostsze rozwiązanie.$anchorScroll
działa w tym celu, ale istnieje znacznie lepszy sposób na użycie go w nowszych wersjach Angulara.Teraz
$anchorScroll
akceptuje skrót jako opcjonalny argument, więc nie musisz go wcale zmieniać$location.hash
. ( dokumentacja )To najlepsze rozwiązanie, ponieważ w ogóle nie wpływa na trasę. Nie mogłem zmusić żadnego z innych rozwiązań do działania, ponieważ używam ngRoute, a trasa załaduje się ponownie, gdy tylko ustawię
$location.hash(id)
, zanim będzie$anchorScroll
mogła wykonać swoją magię.Oto jak go użyć ... po pierwsze, w dyrektywie lub kontrolerze:
a następnie w widoku:
Ponadto, jeśli musisz uwzględnić stały pasek nawigacyjny (lub inny interfejs użytkownika), możesz ustawić przesunięcie dla $ anchorScroll w następujący sposób (w funkcji uruchamiania modułu głównego):
źródło
id
w tym widoku.ngRoute
i nowszej wersji Angulara.To było moje rozwiązanie wykorzystujące dyrektywę, która wydaje się bardziej kątowa, ponieważ mamy do czynienia z DOM:
Plnkr tutaj
github
KOD
HTML
Korzystałem z usługi $ anchorScroll. Aby przeciwdziałać odświeżaniu strony, które towarzyszy zmianie skrótu, poszedłem do przodu i anulowałem zdarzenie locationChangeStart. To działało dla mnie, ponieważ miałem stronę pomocy podłączoną do przełącznika ng, a odświeżenia zasadniczo spowodowałyby uszkodzenie aplikacji.
źródło
Spróbuj ustawić prefiks skrótu dla tras kątowych
$locationProvider.hashPrefix('!')
Pełny przykład:
źródło
Obejrzałem to w logice trasy dla mojej aplikacji.
źródło
To jest stary post, ale długo szukałem różnych rozwiązań, więc chciałem podzielić się jeszcze jednym prostym. Właśnie dodanie
target="_self"
do<a>
tagu naprawiło to dla mnie. Link działa i zabiera mnie do właściwej lokalizacji na stronie.Jednak Angular nadal wprowadza dziwność z # w adresie URL, więc możesz napotkać problemy przy użyciu przycisku Wstecz do nawigacji i tak po użyciu tej metody.
źródło
Może to być nowy atrybut ngView, ale udało mi się uzyskać linki kotwiczące do pracy z
angular-route
użyciemngView autoscroll
atrybutu i „podwójnych skrótów”.ngView (patrz automatyczne przewijanie)
(Poniższy kod został użyty z paskiem kątowym)
źródło
Mógłbym to zrobić tak:
źródło
Oto rodzaj nieprzyjemnego obejścia, tworząc niestandardową dyrektywę, która będzie przewijać do określonego elementu (z zakodowanym „faq”)
http://plnkr.co/edit/Po37JFeP5IsNoz5ZycFs?p=preview
źródło
$anchorScroll
, patrz moja odpowiedź.źródło
Jeśli nie chcesz używać,
ng-click
oto alternatywne rozwiązanie. Używa afilter
do wygenerowania poprawnego adresu URL na podstawie bieżącego stanu. Mój przykład używa ui.router .Zaletą jest to, że użytkownik zobaczy, gdzie link przechodzi w dymek.
Filtr:
źródło
Moim rozwiązaniem z ng-route była ta prosta dyrektywa:
HTML wygląda następująco:
źródło
scroll-to="yourid"
i nazwać dyrektywęscrollTo
(i uzyskać do niego dostęp jakoattrs["scrollTo"]
? Poza tym, bez wyraźnego włączenia jQuery, program obsługi musi być związanyelement.on('click', function (e) {..})
.Możesz spróbować użyć anchorScroll .
Przykład
Tak więc kontrolerem będzie:
I widok:
... i nie ma tajemnicy dla identyfikatora kotwicy:
źródło
Próbowałem zmusić moją aplikację Angular do przewinięcia do ładowania kotwicy i natknąłem się na reguły przepisywania adresów URL $ routeProvider.
Po długich eksperymentach zdecydowałem się na to:
źródło
Nie jestem w 100% pewien, czy to działa cały czas, ale w mojej aplikacji daje to oczekiwane zachowanie.
Powiedzmy, że jesteś na stronie O NAS i masz następującą trasę:
Teraz w tobie HTML
Podsumowując
Uwzględnienie nazwy strony, zanim kotwica załatwiła sprawę. Daj mi znać o swoich myślach.
Minusem
Spowoduje to ponowne renderowanie strony, a następnie przewinięcie do kotwicy.
AKTUALIZACJA
Lepszym sposobem jest dodanie następujących elementów:
źródło
Uzyskaj łatwo funkcję przewijania. Obsługuje także przewijanie animowane / płynne jako dodatkową funkcję. Szczegóły dotyczące biblioteki Angular Scroll :
Github - https://github.com/oblador/angular-scroll
Altana :
bower install --save angular-scroll
npm :
npm install --save angular-scroll
Wersja Minfied - tylko 9kb
Płynne przewijanie (animowane przewijanie) - tak
Przewiń Szpiega - tak
Dokumentacja - doskonała
Demo - http://oblador.github.io/angular-scroll/
Mam nadzieję że to pomoże.
źródło
Na podstawie @Stoyan opracowałem następujące rozwiązanie:
źródło
Przy zmianie trasy przewinie się do góry strony.
umieść ten kod na kontrolerze.
źródło
Moim zdaniem @slugslog miał to, ale chciałbym zmienić jedną rzecz. Zamiast tego użyłbym zamiennika, więc nie trzeba go ustawiać z powrotem.
Dokumenty Wyszukaj „Zamień metodę”
źródło
Żadne z powyższych rozwiązań nie działa dla mnie, ale właśnie wypróbowałem to i zadziałało,
Uświadomiłem sobie, że muszę powiadomić stronę, aby rozpocząć od strony indeksu, a następnie użyć tradycyjnej kotwicy.
źródło
Kiedyś w aplikacji angularjs nawigacja skrótu nie działa, a biblioteki javascript jquery bootstrap w szerokim zakresie wykorzystują ten rodzaj nawigacji, aby działał, dodając go
target="_self"
do tagu anchor. na przykład<a data-toggle="tab" href="#id_of_div_to_navigate" target="_self">
źródło
Zobacz https://code.angularjs.org/1.4.10/docs/api/ngRoute/provider/ $ routeProvider
Ustawienie tej wartości na false spowodowało, że nie udało mi się wykonać powyższych czynności.
źródło
Używam AngularJS 1.3.15 i wygląda na to, że nie muszę robić nic specjalnego.
https://code.angularjs.org/1.3.15/docs/api/ng/provider/ $ anchorScrollProvider
Tak więc w moim html działa dla mnie:
W ogóle nie musiałem wprowadzać żadnych zmian w moim kontrolerze ani JavaScript.
źródło