Saya ingin menambahkan beberapa tautan di halaman Angular2 saya, yang ketika diklik, akan melompat ke posisi tertentu dalam halaman itu, seperti yang dilakukan oleh hashtag biasa. Jadi tautannya akan seperti ini
/users/123#userInfo
/users/123#userPhoto
/users/123#userLikes
dll.
Saya tidak berpikir saya membutuhkan HashLocationStrategy, karena saya baik-baik saja dengan cara Angular2 normal, tetapi jika saya menambahkan secara langsung, tautannya sebenarnya akan melompat ke root, bukan di suatu tempat di halaman yang sama. Segala arah dihargai, terima kasih.
123
ada dalam pertanyaan) dengan asumsi bahwa jalur rute mengharapkan parameter seperti{ path: 'users/:id', ....}
01
atau100
bukan pemilih CSS yang valid. Anda mungkin ingin menambahkan surat atau sesuatu untuk membuatnya menjadi pemilih yang valid. Jadi, Anda masih akan lulus01
sebagai fragmen, tetapiid
harus sepertid01
dan karenanyadocument.querySelector('#d'+id)
akan cocok.Meskipun jawaban Günter benar, namun tidak mencakup "lompat ke" bagian tag jangkar .
Oleh karena itu, tambahan untuk:
... di komponen (induk) tempat Anda memerlukan perilaku "lompat ke", tambahkan:
Harap dicatat bahwa ini adalah solusi ! Ikuti masalah github ini untuk pembaruan di masa mendatang. Penghargaan untuk Victor Savkin karena telah memberikan solusinya!
sumber
"['../faq']"
nilainya atau ia akan mencoba melompat ke / faq / faq / # anchor, insteaf dari / faq / # anchor. Apakah ini cara yang benar untuk melakukannya atau adakah cara yang lebih elegan untuk merujuk ke halaman saat ini di routerlink? Juga,document.querySelector("#" + tree.fragment);
memberi saya kesalahan pemilih yang bukan valid. Apakah Anda yakin ini benar? Terima kasih<a [routerLink]="['/faq']" fragment="section6">
?Maaf sudah terlambat menjawabnya; Ada fungsi yang telah ditentukan sebelumnya di Angular Routing Documentation yang membantu kita dalam melakukan routing dengan hashtag to page anchor yaitu, anchorScrolling: 'enabled'
Langkah-1: - Pertama Impor RouterModule di file app.module.ts: -
Langkah-2: - Buka Halaman HTML, Buat navigasi dan tambahkan dua atribut penting seperti [routerLink] dan fragmen untuk mencocokkan ID Div masing-masing : -
Langkah-3: - Buat bagian / div dengan mencocokkan nama ID dengan fragmen : -
Untuk referensi Anda, saya telah menambahkan contoh di bawah ini dengan membuat demo kecil yang membantu menyelesaikan masalah Anda.
sumber
scrollPositionRestoration: 'enabled',
bawah opsi anchorScrolling :)Sedikit terlambat, tetapi inilah jawaban yang menurut saya berhasil:
Dan di komponen:
Hal di atas tidak secara otomatis menggulir ke tampilan jika Anda membuka halaman dengan jangkar, jadi saya menggunakan solusi di atas di ngInit saya sehingga bisa bekerja dengan itu juga:
Pastikan untuk mengimpor Router, ActivatedRoute dan NavigationEnd di awal komponen Anda dan semuanya akan berjalan lancar.
Sumber
sumber
document.querySelector ( "#" + f )
memberi saya kesalahan karena mengharapkan pemilih, bukan string.element.scrollIntoView()
(tanpa meneruskanelement
ke fungsi). Untuk membuat halus, gunakan ini:element.scrollIntoView({block: "end", behavior: "smooth"})
.onAnchorClick()
, kita harus melewati boolean ke scrollIntoView:if (element) { element.scrollIntoView(true); }
. Sekarang saya dapat mengklik dua kali pada tautan yang sama dan karya gulirTak satu pun dari jawaban sebelumnya berhasil untuk saya. Dalam upaya terakhir, saya mencoba di template saya:
Dengan ini di .ts saya:
Dan berfungsi seperti yang diharapkan untuk tautan internal. Ini sebenarnya tidak menggunakan tag jangkar sehingga tidak akan menyentuh URL sama sekali.
sumber
Solusi di atas tidak berhasil untuk saya ... Yang ini berhasil:
Pertama, persiapkan
MyAppComponent
untuk pengguliran otomatis di ngAfterViewChecked () ...Kemudian, navigasikan untuk
my-app-route
mengirimprodID
hashtagsumber
Semua jawaban lainnya akan bekerja pada versi Angular <6.1. Tetapi jika Anda memiliki versi terbaru maka Anda tidak perlu melakukan peretasan jelek ini karena Angular telah memperbaiki masalahnya.
berikut ini tautan untuk menerbitkannya
Yang perlu Anda lakukan adalah disetel
scrollOffset
dengan opsiRouterModule.forRoot
metode argumen kedua .sumber
Gunakan ini untuk modul router di
app-routing.module.ts
:Ini akan ada di HTML Anda:
sumber
Dalam file html:
Dalam file ts:
sumber
Karena properti fragmen masih tidak menyediakan pengguliran jangkar, solusi ini berhasil bagi saya:
sumber
Menambah jawaban Kalyoyan , langganan ini terikat ke router dan akan aktif sampai halaman tersebut sepenuhnya di-refresh. Saat berlangganan acara router dalam sebuah komponen, pastikan untuk berhenti berlangganan di ngOnDestroy:
sumber
Saya baru saja membuat ini berfungsi di situs web saya sendiri, jadi saya pikir akan bermanfaat untuk memposting solusi saya di sini.
Dan kemudian di komponen Anda, pastikan Anda menyertakan ini:
sumber
element.scrollIntoView()
atauelement.scrollIntoView(true)
. Versi Anda tidak dapat dikompilasi untuk saya (mungkin karena strictNullChecks?).Setelah membaca semua solusi, saya mencari komponen dan saya menemukan satu yang melakukan persis seperti yang diminta pertanyaan asli: menggulir ke tautan jangkar. https://www.npmjs.com/package/ng2-scroll-to
Saat Anda menginstalnya, Anda menggunakan sintaks seperti:
Ini telah bekerja dengan sangat baik untuk saya.
sumber
Solusi sederhana yang berfungsi untuk halaman tanpa parameter kueri apa pun, adalah browser mundur / maju, sesuai dengan router dan tautan dalam.
Batas waktu hanya untuk memungkinkan halaman memuat data dinamis apa pun yang "dilindungi" oleh * ngIf. Ini juga dapat digunakan untuk menggulir ke bagian atas halaman saat mengubah rute - cukup berikan tag anchor atas default.
sumber
jika tidak masalah untuk menambahkan id elemen ke url, Anda harus mempertimbangkan untuk melihat tautan ini:
Angular 2 - Tautan Jangkar ke Elemen di Halaman Saat Ini
sumber
Berikut adalah solusi lain dengan referensi ke jawaban JavierFuentes:
dalam naskah:
Ini memungkinkan pengguna untuk langsung menggulir ke elemen, jika pengguna langsung membuka halaman yang memiliki hashtag di url.
Tetapi dalam kasus ini, saya telah berlangganan Fragmen rute
ngAfterViewChecked
tetapingAfterViewChecked()
dipanggil terus menerus per setiapngDoCheck
dan itu tidak memungkinkan pengguna untuk menggulir kembali ke atas, jadirouteFragmentSubscription.unsubscribe
dipanggil setelah batas waktu 0 milidetik setelah tampilan digulir ke elemen.Selain itu,
gotoHashtag
metode didefinisikan untuk menggulir ke elemen ketika pengguna secara khusus mengklik tag jangkar.Memperbarui:
Jika url memiliki string kueri,
[routerLink]="['self-route', id]"
di jangkar tidak akan mempertahankan string kueri. Saya mencoba solusi berikut untuk hal yang sama:sumber
Yang ini berhasil untukku !! NgFor ini jadi tag jangkar secara dinamis, Anda harus menunggu mereka merender
HTML:
File ts saya:
Jangan lupa untuk mengimpor itu
ViewChildren
,QueryList
dll .. dan menambahkan beberapa konstruktorActivatedRoute
!!sumber
Tidak seperti jawaban yang lain saya juga juga menambahkan
focus()
bersama denganscrollIntoView()
. Juga saya gunakansetTimeout
karena melompat ke atas jika tidak saat mengubah URL. Tidak yakin apa alasannya tetapi tampaknyasetTimeout
ada solusinya.Asal:
Tujuan:
Naskah:
sumber
Saya memiliki masalah yang sama. Solusinya: menggunakan View port Scroller https://angular.io/api/common/ViewportScroller#scrolltoanchor
- kode app-routing.module.ts:
- Komponen HTML
- Kode komponen:
sumber
Saya baru saja menguji plugin yang sangat berguna yang tersedia di nmp - ngx-scroll-to , yang sangat cocok untuk saya. Namun ini dirancang untuk Angular 4+, tetapi mungkin seseorang akan menemukan jawaban ini bermanfaat.
sumber
Saya mencoba sebagian besar solusi ini tetapi mengalami masalah saat keluar dan kembali dengan fragmen lain yang tidak berhasil, jadi saya melakukan sesuatu yang sedikit berbeda yang berfungsi 100%, dan menyingkirkan hash jelek di URL.
tl; dr inilah cara yang lebih baik dari yang pernah saya lihat sejauh ini.
sumber