CATATAN: Ada banyak jawaban berbeda di sini, dan sebagian besar telah valid pada satu waktu atau yang lain. Faktanya adalah apa yang berhasil telah berubah beberapa kali karena tim Angular telah mengubah Router-nya. Router versi 3.0 yang pada akhirnya akan menjadi yang router di istirahat Sudut banyak solusi ini, tapi menawarkan solusi yang sangat sederhana sendiri. Pada RC.3, solusi yang lebih disukai adalah menggunakan [routerLinkActive]
seperti yang ditunjukkan dalam jawaban ini .
Dalam aplikasi Angular (saat ini dalam rilis 2.0.0-beta.0 saat saya menulis ini), bagaimana Anda menentukan apa rute aktif saat ini?
Saya sedang mengerjakan aplikasi yang menggunakan Bootstrap 4 dan saya perlu cara untuk menandai tautan / tombol navigasi sebagai aktif ketika komponen terkait mereka ditampilkan dalam sebuah <router-output>
tag.
Saya menyadari bahwa saya dapat mempertahankan keadaan sendiri ketika salah satu tombol diklik, tetapi itu tidak akan mencakup kasus memiliki beberapa jalur ke rute yang sama (katakanlah menu navigasi utama serta menu lokal di komponen utama ).
Saran atau tautan apa pun akan dihargai. Terima kasih.
sumber
@input
opsi untuk, tetapiexact: false
mengaktifkan kelas kapan pun saudara rute saat ini juga aktif.router.navigate()
akan berfungsi dengan baik.routerLinkActive
hanyalah indikator apakah tautan ini mewakili rute aktif.Saya telah menjawab ini dalam pertanyaan lain, tetapi saya percaya ini mungkin relevan dengan yang ini juga. Berikut tautan ke jawaban asli: Angular 2: Cara menentukan rute aktif dengan parameter?
Saya sudah mencoba mengatur aktif kelas tanpa harus tahu persis apa lokasi saat ini (menggunakan nama rute) . Solusi terbaik yang saya dapatkan sejauh ini adalah menggunakan fungsi isRouteActive yang tersedia di
Router
kelas.router.isRouteActive(instruction): Boolean
mengambil satu parameter yang merupakanInstruction
objek rute dan mengembalikantrue
ataufalse
apakah instruksi itu berlaku atau tidak untuk rute saat ini. Anda dapat menghasilkan sebuah ruteInstruction
dengan menggunakanRouter
's menghasilkan (linkParams: Array) . LinkParams mengikuti format yang sama persis dengan nilai yang diteruskan ke direktif routerLink (misalnyarouter.isRouteActive(router.generate(['/User', { user: user.id }]))
).Ini adalah bagaimana RouteConfig dapat terlihat (saya telah sedikit mengubahnya untuk menunjukkan penggunaan params) :
Dan View akan terlihat seperti ini:
Sejauh ini, ini adalah solusi yang saya sukai untuk masalah ini, mungkin juga bermanfaat bagi Anda.
sumber
router.isRouteActive('Home')
.Router
konstruktor kelasname
bukanas
di objek konfigurasi router.router.urlTree.contains(router.createUrlTree(['Home']))
Saya memecahkan masalah yang saya temui dalam tautan ini dan saya menemukan bahwa ada solusi sederhana untuk pertanyaan Anda. Anda dapat menggunakannya
router-link-active
sebagai gantinya dalam gaya Anda.sumber
router-link-active
kelas tidak ditambahkan ke aktifa
atauli
. tapi ada satu tempat saya menggunakan bootstrapnav-tabs
dan berfungsi di sana.Perbaikan kecil untuk jawaban @ alex-correia-santos berdasarkan https://github.com/angular/angular/pull/6407#issuecomment-190179875
Dan gunakan seperti ini:
sumber
styles : [
.active {background-color: aliceblue; }]
. +1 berfungsiAnda dapat memeriksa rute saat ini dengan menyuntikkan
Location
objek ke controller Anda dan memeriksapath()
, seperti:Anda harus memastikan untuk mengimpornya terlebih dahulu:
Anda kemudian dapat menggunakan ekspresi reguler untuk mencocokkan dengan jalur yang dikembalikan untuk melihat rute mana yang aktif. Perhatikan bahwa
Location
kelas mengembalikan jalur yang dinormalisasi apa pun yangLocationStrategy
Anda gunakan. Jadi, bahkan jika Anda menggunakanHashLocationStragegy
jalur yang dikembalikan masih dalam bentuk/foo/bar
tidak#/foo/bar
sumber
UPDATE: diperbarui sesuai Angular2.4.x
lihat lebih lanjut ...
sumber
Untuk menandai rute aktif
routerLinkActive
dapat digunakanIni juga berfungsi pada elemen lain seperti
Jika sebagian kecocokan juga harus ditandai, gunakan
Sejauh yang saya tahu
exact: false
akan menjadi default di RC.4sumber
Saat ini saya menggunakan rc.4 dengan bootstrap 4 dan ini berfungsi sempurna untuk saya:
Ini akan berfungsi untuk url: / home
sumber
/home/whatever
?exact
maksudnya, rute itu akan memiliki nama yang sama. Dan ini diperlukan jika Anda berencana menggunakannya dengan alat seperti twitter bootstrap. Ini sudah menangani status tautan aktif dan tanpaexact
opsi tidak akan berfungsi. (tidak yakin tentang bagaimana cara kerjanya pada intinya, saya telah mencobanya dan itu bekerja untuk saya)Di bawah ini adalah metode menggunakan RouteData ke menu styleBar item tergantung dari rute saat ini:
RouteConfig termasuk data dengan tab (rute saat ini):
Sepotong tata letak:
Kelas:
sumber
Saya pikir saya akan menambahkan contoh yang tidak menggunakan naskah apa pun:
The
routerLinkActive
variabel terikat ke variabel template dan kemudian kembali digunakan sebagai diperlukan. Sayangnya satu-satunya peringatan adalah bahwa Anda tidak dapat memiliki semua ini pada<section>
elemen karena#home
perlu diselesaikan sebelum parser memukul<section>
.sumber
Router
di Angular 2 RC tidak lagi mendefinisikanisRouteActive
dangenerate
metode.Coba ikuti
perhatikan,
routeSegment : RouteSegment
harus disuntikkan ke konstruktor komponen.sumber
Berikut adalah contoh lengkap untuk menambahkan styling rute aktif dalam versi Angular
2.0.0-rc.1
yang memperhitungkan jalur akar nol akun (mis.path: '/'
)app.component.ts -> Rute
app.component.html
sumber
Solusi untuk Angular2 RC 4:
sumber
Pada Angular 8, ini berfungsi:
{ exact: true }
memastikan cocok dengan url.sumber
pada tahun 2020 jika Anda ingin mengatur kelas aktif pada elemen yang tidak memiliki [routerLink] - Anda dapat melakukannya dengan mudah:
sumber
Solusi Lain. Jauh lebih mudah di Angular Router V3 Alpha. dengan menyuntikkan Router
pemakaian
sumber
Di Angular2 RC2 Anda dapat menggunakan implementasi sederhana ini
ini akan menambah kelas
active
ke elemen dengan url yang cocok, baca lebih lanjut di sinisumber
Di bawah ini adalah jawaban untuk pertanyaan ini untuk semua versi versi Angular 2 RC yang dirilis hingga saat ini:
RC4 dan RC3 :
Untuk menerapkan kelas ke tautan atau leluhur tautan:
/ home harus menjadi URL dan bukan nama rute karena properti nama tidak lagi ada di Route Object pada Router v3.
Lebih lanjut tentang routerLinkActive direktif di tautan ini .
Untuk menerapkan kelas ke div mana pun berdasarkan rute saat ini:
misalnya
RC2 dan RC1 :
Gunakan kombinasi router.isRouteActive dan kelas. *. misalnya untuk menerapkan kelas aktif berdasarkan Rute Rumah.
Nama dan url keduanya dapat diteruskan ke router.generate.
sumber
Penggunaan
routerLinkActive
bagus dalam kasus-kasus sederhana, ketika ada tautan dan Anda ingin menerapkan beberapa kelas. Tetapi dalam kasus yang lebih kompleks di mana Anda mungkin tidak memiliki routerLink atau di mana Anda membutuhkan sesuatu yang lebih, Anda dapat membuat dan menggunakan pipa :kemudian:
dan jangan lupa untuk memasukkan pipa ke dalam dependensi pipa;)
sumber
containsTree
didefinisikan?Untuk Angular versi 4+, Anda tidak perlu menggunakan solusi yang rumit. Anda cukup menggunakan
[routerLinkActive]="'is-active'"
.Sebagai contoh dengan tautan bootstrap 4 nav:
sumber
Sebuah instance dari kelas Router sebenarnya adalah Observable dan mengembalikan jalur saat ini setiap kali ia berubah. Beginilah cara saya melakukannya:
Dan kemudian di HTML saya:
sumber
Seperti disebutkan dalam salah satu komentar dari jawaban yang diterima,
routerLinkActive
arahan juga dapat diterapkan pada wadah<a>
tag yang sebenarnya .Jadi misalnya dengan tab Bootstrap Twitter tempat kelas aktif harus diterapkan ke
<li>
tag yang berisi tautan:Cukup rapi! Saya kira arahan memeriksa konten tag dan mencari
<a>
tag denganrouterLink
arahan.sumber
Solusi sederhana untuk pengguna sudut 5 adalah, cukup tambahkan
routerLinkActive
ke item daftar.Sebuah
routerLinkActive
direktif dikaitkan dengan rute melaluirouterLink
direktif.Dibutuhkan sebagai input array kelas yang akan ditambahkan ke elemen yang dilampirkan jika rute saat ini aktif, seperti:
Di atas akan menambahkan kelas aktif ke tag jangkar jika kita saat ini melihat rute rumah.
sumber
Dan dalam versi sudut terbaru, Anda cukup melakukan pengecekan
router.isActive(routeNameAsString)
. Sebagai contoh, lihat contoh di bawah ini:Dan pastikan Anda tidak melupakan router injeksi di komponen Anda.
sumber
Saya sedang mencari cara untuk menggunakan gaya Bootstrap Twitter nav dengan Angular2, tetapi kesulitan mendapatkan
active
kelas yang diterapkan pada elemen induk dari tautan yang dipilih. Menemukan bahwa solusi @ alex-correia-santos bekerja dengan sempurna!Komponen yang berisi tab Anda harus mengimpor perute dan menentukannya dalam konstruktornya sebelum Anda dapat melakukan panggilan yang diperlukan.
Berikut ini adalah versi implementasi saya yang disederhanakan ...
sumber
katakanlah Anda ingin menambahkan CSS ke status / tab aktif saya. Gunakan routerLinkActive untuk mengaktifkan tautan perutean Anda.
catatan: 'aktif' adalah nama kelas saya di sini
sumber
Saya menggunakan router sudut
^3.4.7
dan saya masih mengalami masalah denganrouterLinkActive
arahan.Ini tidak berfungsi jika Anda memiliki banyak tautan dengan url yang sama plus sepertinya tidak menyegarkan sepanjang waktu.
Terinspirasi oleh @tomaszbak, saya membuat komponen kecil untuk melakukan pekerjaan
sumber
Seperti template html murni
sumber
mulai dengan mengimpor RouterLinkActive di .ts Anda
Sekarang gunakan RouterLinkActive di HTML Anda
berikan beberapa css ke kelas "class_Name", karena ketika tautan ini akan aktif / diklik Anda akan menemukan kelas ini pada rentang waktu inspeksi.
sumber
Cara terprogram akan melakukannya dalam komponen itu sendiri. Saya berjuang tiga minggu dalam masalah ini, tetapi menyerah pada dokumen sudut dan membaca kode aktual yang membuat routerlinkactive berfungsi dan Thats tentang dokumen terbaik yang dapat saya temukan.
Catatan :
Untuk cara yang terprogram, pastikan untuk menambahkan tautan router dan membutuhkan elemen turunan. Jika Anda ingin mengubahnya, Anda harus menyingkirkan anak-anak
superclass.nativeElement
.sumber