Apakah AngularJS membantu dengan cara menetapkan active
kelas pada tautan untuk halaman saat ini?
Saya membayangkan ada beberapa cara ajaib yang dilakukan, tetapi sepertinya saya tidak dapat menemukannya.
Menu saya terlihat seperti:
<ul>
<li><a class="active" href="/tasks">Tasks</a>
<li><a href="/actions">Tasks</a>
</ul>
dan saya memiliki pengontrol untuk masing-masing di rute saya: TasksController
dan ActionsController
.
Tetapi saya tidak dapat menemukan cara untuk mengikat kelas "aktif" pada a
tautan ke pengontrol.
Ada petunjuk?
ngClass="{active: isActive('/tasks')}
, di manaisActive()
akan mengembalikan boolean karena decouples controller dan markup / styling.Saya sarankan menggunakan arahan pada tautan.
Tapi ini belum sempurna. Hati-hati dengan hashbangs;)
Berikut adalah javascript untuk direktif:
dan inilah bagaimana ini akan digunakan dalam html:
setelah itu styling dengan css:
sumber
var path = $(element).children("a")[0].hash.substring(1);
. Ini akan bekerja untuk gaya seperti<li active-link="active"><a href="#/dashboard">Dashboard</a></li>
scope.$watch('location.path()', function(newPath) {
untukscope.$on('$locationChangeStart', function(){
.var path = attrs.href;
kevar path = attrs.href||attrs.ngHref;
<li>
, Anda dapat mengubahelement.addClass(clazz);
keelement.parent().addClass(clazz);
Inilah pendekatan sederhana yang bekerja dengan baik dengan Angular.
Di dalam pengontrol AngularJS Anda:
Utas ini memiliki sejumlah jawaban serupa lainnya.
Bagaimana cara mengatur kelas aktif bootstrap navbar dengan Angular JS?
sumber
return viewLocation === $location.path()
Hanya untuk menambahkan dua sen saya dalam perdebatan saya telah membuat modul sudut murni (tanpa jQuery), dan itu juga akan bekerja dengan hash url yang berisi data. (mis.
#/this/is/path?this=is&some=data
)Anda cukup menambahkan modul sebagai dependensi dan
auto-active
ke salah satu leluhur menu. Seperti ini:Dan modulnya terlihat seperti ini:
(Tentu saja Anda bisa menggunakan bagian arahan)
Perlu juga diperhatikan bahwa ini tidak bekerja untuk hash kosong (misalnya
example.com/#
atau hanyaexample.com
) yang harus dimiliki setidaknyaexample.com/#/
atau adilexample.com#/
. Tetapi ini terjadi secara otomatis dengan ngResource dan sejenisnya.Dan ini biola: http://jsfiddle.net/gy2an/8/
sumber
Dalam kasus saya, saya menyelesaikan masalah ini dengan membuat pengontrol sederhana yang bertanggung jawab untuk navigasi
Dan dengan hanya menambahkan kelas-ng ke elemen seperti:
sumber
Untuk pengguna Router AngularUI :
Dan itu akan menempatkan
active
kelas pada objek yang dipilih.sumber
Ada
ng-class
arahan, yang mengikat variabel dan kelas css. Itu juga menerima objek (className vs pasangan nilai bool).Berikut ini contohnya, http://plnkr.co/edit/SWZAqj
sumber
/test1/blahblah
atau akankah itu?active: activePath=='/test1'
secara otomatis mengembalikan "aktif" adalah jalan dimulai dengan string yang diberikan? Apakah ini semacam operator atau regex yang telah ditentukan?==
cek berulang di html.The jawaban dari @ Renan-Tomal-fernandes baik, tetapi membutuhkan beberapa perbaikan untuk bekerja dengan benar. Seperti itu, selalu mendeteksi tautan ke beranda (/) sebagai dipicu, bahkan jika Anda berada di bagian lain.
Jadi saya memperbaikinya sedikit, ini kodenya. Saya bekerja dengan Bootstrap sehingga bagian yang aktif ada di
<li>
elemen, bukan di bagian<a>
.Pengendali
Templat
sumber
Berikut adalah solusi yang saya buat setelah membaca beberapa saran bagus di atas. Dalam situasi khusus saya, saya mencoba menggunakan komponen tab Bootstrap sebagai menu saya, tetapi tidak ingin menggunakan versi Angular-UI ini karena saya ingin tab bertindak sebagai menu, di mana setiap tab dapat bookmark, alih-alih tab yang bertindak sebagai navigasi untuk satu halaman. (Lihat http://angular-ui.github.io/bootstrap/#/tabs jika Anda tertarik dengan tampilan tab bootstrap versi Angular-UI).
Saya benar-benar menyukai jawaban kfis tentang membuat arahan Anda sendiri untuk menangani hal ini, namun tampaknya rumit untuk memiliki arahan yang perlu ditempatkan pada setiap tautan. Jadi saya telah membuat direktif Angular saya yang ditempatkan sebagai gantinya satu kali pada
ul
. Kalau-kalau ada orang lain yang mencoba melakukan hal yang sama, saya pikir saya akan mempostingnya di sini, meskipun seperti yang saya katakan, banyak solusi di atas juga berfungsi. Ini adalah solusi yang sedikit lebih kompleks sejauh javascript berjalan, tetapi ini menciptakan komponen yang dapat digunakan kembali dengan markup minimal.Berikut adalah javascript untuk direktif dan penyedia rute untuk
ng:view
:Kemudian di html Anda, Anda cukup:
Inilah penyedotnya: http://plnkr.co/edit/xwGtGqrT7kWoCKnGDHYN?p=preview .
sumber
Anda dapat menerapkan ini dengan sangat sederhana, berikut ini sebuah contoh:
Dan Pengontrol Anda harus seperti ini:
sumber
gunakan direktif ui-sref-active direktif angular-ui-router https://github.com/angular-ui/ui-router/wiki/Quick-Reference#statename
sumber
Saya memiliki masalah yang sama dengan menu yang terletak di luar lingkup pengontrol. Tidak yakin apakah ini solusi terbaik atau yang disarankan, tetapi inilah yang berhasil bagi saya. Saya telah menambahkan yang berikut ini ke konfigurasi aplikasi saya:
Kemudian dalam tampilan saya punya:
sumber
Menggunakan Angular Versi 6 dengan Bootstrap 4.1
Saya bisa menyelesaikannya seperti yang terlihat di bawah ini.
Pada contoh di bawah ini, ketika URL melihat '/ kontak', bootstrap aktif kemudian ditambahkan ke tag html. Ketika URL berubah itu kemudian dihapus.
Baca lebih lanjut di situs web Angular
sumber
Menggunakan arahan (karena kita melakukan manipulasi DOM di sini), berikut ini mungkin yang paling dekat dengan melakukan hal-hal dengan "sudut":
Maka HTML Anda akan terlihat seperti:
sumber
menu-item
sepertinya mubazir di setiap baris. Mungkin melampirkan atribut keul
elemen (misalnya<ul menu>
) akan lebih baik, tapi saya tidak yakin apakah itu mungkin.Saya melakukannya seperti ini:
Ini memungkinkan Anda memiliki tautan di bagian yang memiliki arahan track-aktif:
Pendekatan ini tampaknya jauh lebih bersih daripada yang lain, bagi saya.
Juga, jika Anda menggunakan jQuery, Anda bisa membuatnya lebih rapi karena jQlite hanya memiliki dukungan pemilih dasar. Versi yang jauh lebih bersih dengan jquery yang disertakan sebelum angular termasuk akan terlihat seperti ini:
Ini jsFiddle
sumber
Solusi saya untuk masalah ini, gunakan
route.current
di template sudut.Karena Anda memiliki
/tasks
rute untuk disorot di menu Anda, Anda dapat menambahkan properti Anda sendirimenuItem
ke rute yang dinyatakan oleh modul Anda:Kemudian dalam template
tasks.html
Anda, Anda dapat menggunakanng-class
arahan berikut :Menurut pendapat saya, ini jauh lebih bersih daripada semua solusi yang diusulkan.
sumber
Berikut ini adalah ekstensi pada arahan kfis yang saya lakukan untuk memungkinkan berbagai tingkat pencocokan jalur. Pada dasarnya saya menemukan kebutuhan untuk mencocokkan jalur URL hingga kedalaman tertentu, karena pencocokan tepat tidak memungkinkan untuk pengalihan bersarang dan pengalihan status default. Semoga ini membantu.
Dan inilah cara saya menggunakan tautannya
Arahan ini akan cocok dengan level kedalaman yang ditentukan dalam nilai atribut untuk arahan. Hanya berarti dapat digunakan di tempat lain berkali-kali.
sumber
Berikut ini adalah arahan lain untuk menyoroti tautan aktif.
Fitur utama:
Kode:
Pemakaian:
Contoh sederhana dengan ekspresi sudut, katakanlah $ scope.var = 2 , maka tautan akan aktif jika lokasi / url / 2 :
Contoh bootstrap, induk li akan mendapatkan kelas aktif:
Contoh dengan url bersarang, tautan akan aktif jika url bersarang aktif (yaitu / url / 1 , / url / 2 , url / 1/2 / ... )
Contoh kompleks, tautan menunjuk ke satu url ( / url1 ) tetapi akan aktif jika yang lain dipilih ( / url2 ):
Contoh dengan tautan yang dinonaktifkan, jika tidak aktif, kelasnya akan 'dinonaktifkan' :
Semua atribut tautan aktif * dapat digunakan dalam kombinasi apa pun, sehingga kondisi yang sangat rumit dapat diterapkan.
sumber
Jika Anda menginginkan tautan untuk arahan dalam bungkus daripada memilih masing-masing tautan (membuatnya lebih mudah untuk melihat cakupan di Batarang), ini juga berfungsi dengan baik:
Markup akan menjadi:
Saya juga harus menyebutkan bahwa saya menggunakan jQuery 'full-fat' dalam contoh ini, tetapi Anda dapat dengan mudah mengubah apa yang telah saya lakukan dengan pemfilteran dan sebagainya.
sumber
Ini dua sen saya, ini berfungsi dengan baik.
CATATAN: Ini tidak cocok dengan halaman anak-anak (yang saya butuhkan).
Melihat:
Pengendali:
sumber
Menurut jawaban @kfis, ini adalah komentar, dan rekomendasi saya, arahan akhir seperti di bawah ini:
sumber
Bagi mereka yang menggunakan ui-router, jawaban saya agak mirip dengan Ender2050, tapi saya lebih suka melakukan ini melalui pengujian nama negara:
HTML yang sesuai:
sumber
Tidak ada saran direktif di atas yang berguna bagi saya. Jika Anda memiliki navbar bootstrap seperti ini
(yang bisa menjadi
$ yo angular
startup) maka Anda ingin menambahkan.active
ke daftar kelas elemen induk<li>
, bukan elemen itu sendiri; yaitu<li class="active">..</li>
. Jadi saya menulis ini:penggunaan
set-parent-active
;.active
default jadi tidak perlu diaturdan
<li>
elemen induk akan menjadi.active
ketika tautan aktif. Untuk menggunakan.active
kelas alternatif seperti.highlight
, cukupsumber
Yang paling penting bagi saya adalah tidak mengubah sama sekali kode default bootstrap. Ini dia pengontrol menu saya yang mencari opsi menu dan kemudian menambahkan perilaku yang kita inginkan.
sumber
punya masalah yang sama. Ini solusinya :
sumber
Saya baru saja menulis arahan untuk ini.
Pemakaian:
Penerapan:
Tes:
sumber
Rute:
Menu html:
Pengontrol:
Masalah yang saya temukan di sini adalah bahwa item menu hanya aktif ketika halaman penuh dimuat. Ketika tampilan parsial dimuat menu tidak berubah. Ada yang tahu mengapa itu terjadi?
sumber
sumber
Saya menemukan solusi termudah. hanya untuk membandingkan indexOf dalam HTML
sumber