Apakah ada di antara Anda yang tahu cara menangani tautan hash dengan baik di AngularJS ?
Saya memiliki markup berikut untuk halaman FAQ sederhana
<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>
Ketika mengklik salah satu tautan di atas AngularJS memotong dan merutekan saya ke halaman yang sama sekali berbeda (dalam kasus saya, 404 halaman karena tidak ada rute yang cocok dengan tautan tersebut.)
Pikiran pertama saya adalah membuat rute yang cocok dengan " / faq /: bab " dan di controller yang sesuai memeriksa $routeParams.chapter
setelah elemen yang cocok dan kemudian menggunakan jQuery untuk menggulir ke bawah ke sana.
Tapi kemudian AngularJS marah pada saya lagi dan hanya menggulir ke bagian atas halaman.
Jadi, ada orang di sini yang pernah melakukan hal serupa di masa lalu dan tahu solusi yang baik untuk itu?
Sunting: Beralih ke html5Mode harus menyelesaikan masalah saya, tetapi kami agaknya harus mendukung IE8 + jadi saya khawatir ini bukan solusi yang diterima: /
sumber
ng-href=""
sebagai gantinya.Jawaban:
Anda sedang mencari
$anchorScroll()
.Inilah dokumentasi (jelek).
Dan inilah sumbernya.
Pada dasarnya Anda hanya menyuntikkannya dan memanggilnya di controller Anda, dan itu akan menggulir Anda ke elemen apa pun dengan id ditemukan di
$location.hash()
Berikut ini adalah salah satu pendongkrak untuk diperagakan
EDIT: untuk menggunakan ini dengan routing
Atur perutean sudut Anda seperti biasa, lalu tambahkan saja kode berikut.
dan tautan Anda akan terlihat seperti ini:
Berikut ini adalah seorang Plunker yang menunjukkan pengguliran dengan perutean dan $ anchorScroll
Dan bahkan lebih sederhana:
dan tautan Anda akan terlihat seperti ini:
sumber
<a href="#foo">foo</a>
. Contoh kode saya adalah untuk menunjukkan gulir ke id di routechange.$location.search('scrollTo', null)
Dalam kasus saya, saya perhatikan bahwa logika routing menendang jika saya memodifikasi
$location.hash()
. Trik berikut berhasil ..sumber
$location.hash(my_id); $anchorScroll; $location.hash(null)
. Ini mencegah ulang dan saya tidak perlu mengelolaold
variabel.Tidak perlu mengubah perutean apa pun atau apa pun hanya perlu digunakan
target="_self"
saat membuat tautanContoh:
Dan gunakan
id
atribut di html Anda elemen seperti ini:Tidak perlu menggunakan ## seperti yang ditunjukkan / disebutkan dalam komentar ;-)
sumber
sumber
Jika Anda selalu tahu rute, Anda bisa menambahkan jangkar seperti ini:
di mana
route
rute sudut saat ini dananchorID
cocok dengan suatu<a id="anchorID">
tempat di halamansumber
reloadOnSearch: false
untuk rute itu di konfigurasi rute Anda, angular tidak akan memicu perubahan rute dan hanya akan menggulir ke id. Dalam kombinasi dengan rute lengkap yang ditentukan dalama
tag, saya akan mengatakan ini adalah solusi paling sederhana dan paling mudah.$anchorScroll
berfungsi untuk ini, tetapi ada cara yang lebih baik untuk menggunakannya di versi Angular yang lebih baru.Sekarang,
$anchorScroll
terima hash sebagai argumen opsional, jadi Anda tidak perlu mengubah$location.hash
sama sekali. ( dokumentasi )Ini adalah solusi terbaik karena tidak mempengaruhi rute sama sekali. Saya tidak bisa mendapatkan solusi lain untuk bekerja karena saya menggunakan ngRoute dan rute akan dimuat kembali begitu saya atur
$location.hash(id)
, sebelum$anchorScroll
bisa melakukan keajaibannya.Berikut adalah cara menggunakannya ... pertama, dalam arahan atau pengontrol:
dan kemudian di tampilan:
Selain itu, jika Anda perlu memperhitungkan navbar tetap (atau UI lainnya), Anda dapat mengatur offset untuk $ anchorScroll seperti ini (dalam fungsi menjalankan modul utama):
sumber
id
dalam tampilan itu.ngRoute
dan versi Angular yang lebih baru.Ini adalah solusi saya menggunakan arahan yang tampaknya lebih Angular-y karena kita berurusan dengan DOM:
Plnkr di sini
github
KODE
HTML
Saya menggunakan layanan $ anchorScroll. Untuk mengatasi penyegaran-halaman yang sejalan dengan perubahan hash, saya melanjutkan dan membatalkan event locationChangeStart. Ini bekerja untuk saya karena saya memiliki halaman bantuan yang terhubung ke ng-switch dan refresh akan pada dasarnya merusak aplikasi.
sumber
Cobalah untuk mengatur awalan hash untuk rute sudut
$locationProvider.hashPrefix('!')
Contoh lengkap:
sumber
Saya menyiasati ini dalam logika rute untuk aplikasi saya.
sumber
Ini adalah pos lama, tetapi saya menghabiskan waktu lama meneliti berbagai solusi, jadi saya ingin berbagi satu lagi yang sederhana. Hanya menambahkan
target="_self"
pada<a>
tag, memperbaikinya untuk saya. Tautan berfungsi dan membawa saya ke lokasi yang tepat di halaman.Namun, Angular masih menyuntikkan keanehan dengan # di URL sehingga Anda dapat mengalami masalah menggunakan tombol kembali untuk navigasi dan semacamnya setelah menggunakan metode ini.
sumber
Ini mungkin atribut baru untuk ngView, tapi saya sudah bisa mendapatkannya tautan hash jangkar untuk bekerja dengan
angular-route
menggunakanngView autoscroll
atribut dan 'hash ganda'.ngView (lihat autoscroll)
(Kode berikut digunakan dengan angular-strap)
sumber
Saya bisa melakukan ini seperti ini:
sumber
Berikut adalah jenis penyelesaian kotor dengan membuat arahan khusus yang akan bergulir ke elemen tertentu (dengan "faq" hardcod)
http://plnkr.co/edit/Po37JFeP5IsNoz5ZycFs?p=preview
sumber
$anchorScroll
, lihat jawaban saya.sumber
Jika Anda tidak suka menggunakan di
ng-click
sini solusi alternatif. Ini menggunakanfilter
untuk menghasilkan url yang benar berdasarkan pada kondisi saat ini. Contoh saya menggunakan ui.router .Manfaatnya adalah bahwa pengguna akan melihat di mana tautan berjalan melayang.
Filter:
sumber
Solusi saya dengan ng-route adalah arahan sederhana ini:
HTML terlihat seperti:
sumber
scroll-to="yourid"
dan nama direktifscrollTo
(dan mengakses atribut sebagaiattrs["scrollTo"]
? Selain itu, tanpa jQuery inklusielement.on('click', function (e) {..})
Anda dapat mencoba menggunakan anchorScroll .
Contoh
Jadi pengontrolnya adalah:
Dan tampilan:
... dan bukan rahasia untuk jangkar id:
sumber
Saya mencoba membuat aplikasi Angular saya menggulir ke anchor opon loading dan berlari ke aturan penulisan ulang URL dari $ routeProvider.
Setelah lama bereksperimen, saya menyelesaikan ini:
sumber
Saya tidak 100% yakin apakah ini berfungsi sepanjang waktu, tetapi dalam aplikasi saya ini memberi saya perilaku yang diharapkan.
Katakanlah Anda berada di halaman TENTANG dan Anda memiliki rute berikut:
Sekarang, di HTML Anda
Kesimpulannya
Termasuk nama halaman sebelum jangkar melakukan trik untuk saya. Beri tahu saya tentang pemikiran Anda.
Kekurangannya
Ini akan merender ulang halaman dan kemudian gulir ke jangkar.
MEMPERBARUI
Cara yang lebih baik adalah menambahkan yang berikut ini:
sumber
Dapatkan fitur gulir Anda dengan mudah. Ini juga mendukung Penggulungan Animasi / Lancar sebagai fitur tambahan. Detail untuk pustaka Scroll Sudut :
Github - https://github.com/oblador/angular-scroll
Bower :
bower install --save angular-scroll
npm :
npm install --save angular-scroll
Versi kecil - hanya 9kb
Scrolling Halus (scrolling animasi) - ya
Gulir Spy - ya
Dokumentasi - luar biasa
Demo - http://oblador.github.io/angular-scroll/
Semoga ini membantu.
sumber
Berdasarkan @Stoyan saya datang dengan solusi berikut:
sumber
Pada Rute perubahan itu akan gulir ke bagian atas halaman.
letakkan kode ini di pengontrol Anda.
sumber
Dalam pikiran saya @slugslog memilikinya, tetapi saya akan mengubah satu hal. Saya akan menggunakan ganti sehingga Anda tidak harus mengaturnya kembali.
Pencarian Dokumen untuk "Ganti metode"
sumber
Tidak ada solusi di atas yang berfungsi untuk saya, tetapi saya baru saja mencoba ini, dan itu berhasil,
Jadi saya menyadari bahwa saya perlu memberi tahu halaman untuk memulai dengan halaman indeks dan kemudian menggunakan jangkar tradisional.
sumber
Kadang-kadang dalam aplikasi hash navigasi angularjs tidak bekerja dan bootstrap jquery perpustakaan javascript memanfaatkan ekstensif jenis navigasi ini, untuk membuatnya berfungsi menambah
target="_self"
tag anchor. misalnya<a data-toggle="tab" href="#id_of_div_to_navigate" target="_self">
sumber
Lihat https://code.angularjs.org/1.4.10/docs/api/ngRoute/provider/ $ routeProvider
Menetapkan ini ke false melakukan trik tanpa semua hal di atas untuk saya.
sumber
Saya menggunakan AngularJS 1.3.15 dan sepertinya saya tidak perlu melakukan sesuatu yang istimewa.
https://code.angularjs.org/1.3.15/docs/api/ng/provider/ $ anchorScrollProvider
Jadi, berikut ini berfungsi untuk saya di html saya:
Saya tidak harus melakukan perubahan apa pun pada controller atau JavaScript saya sama sekali.
sumber