Saya memiliki rute yang ditetapkan di AngularJS seperti ini:
$routeProvider
.when('/dashboard', {templateUrl:'partials/dashboard', controller:widgetsController})
.when('/lab', {templateUrl:'partials/lab', controller:widgetsController})
Saya memiliki beberapa tautan di topbar yang ditata sebagai tab. Bagaimana saya bisa menambahkan kelas 'aktif' ke tab tergantung pada templat atau url saat ini?
javascript
html
angularjs
Sergei Basharov
sumber
sumber
Jawaban:
Cara untuk mengatasi ini tanpa harus bergantung pada URL adalah dengan menambahkan atribut khusus ke setiap parsial selama
$routeProvider
konfigurasi, seperti ini:Paparkan
$route
di controller Anda:Atur
active
kelas berdasarkan pada tab aktif saat ini:sumber
$scope.activeTab = $route.current.activetab
agar Anda dapat menjaga html sedikit lebih bersih.$rootScope
trik @ Lucas di bawah untuk membuatnya tersedia di semua ruang lingkup.Salah satu cara untuk melakukan ini adalah dengan menggunakan direktif ngClass dan layanan $ location. Dalam templat Anda, Anda bisa melakukan:
di mana
isActive
akan ada fungsi dalam lingkup yang ditentukan seperti ini:Inilah jsFiddle lengkap: http://jsfiddle.net/pkozlowski_opensource/KzAfG/
Mengulang
ng-class="{active:isActive('/dashboard')}"
pada setiap tab navigasi mungkin membosankan (jika Anda memiliki banyak tab) sehingga logika ini mungkin menjadi kandidat untuk arahan yang sangat sederhana.sumber
Mengikuti saran Pavel untuk menggunakan arahan khusus, berikut adalah versi yang tidak perlu menambahkan payload ke routeConfig, super deklaratif, dan dapat diadaptasi untuk bereaksi pada level jalan apa pun, hanya dengan mengubah yang mana
slice()
Anda perhatikan. .Kami mencapai tujuan kami dengan mendengarkan
$routeChangeSuccess
acara, bukan dengan menempatkannya$watch
di jalur. Saya bekerja di bawah keyakinan bahwa ini berarti logika harus berjalan lebih jarang, karena saya pikir jam tangan menyala pada setiap$digest
siklus.Aktifkan itu dengan meneruskan argumen level jalan Anda pada deklarasi direktif. Ini menentukan potongan apa dari $ location.path () saat ini yang ingin Anda cocokkan dengan
href
atribut Anda .Jadi, jika tab Anda bereaksi terhadap level dasar jalur, buat argumen '1'. Jadi, ketika location.path () adalah "/ home", itu akan cocok dengan "# / home" di
href
. Jika Anda memiliki tab yang seharusnya bereaksi ke tingkat kedua, atau ketiga, atau ke 11 jalur, sesuaikan. Pemotongan dari 1 atau lebih ini akan mem-bypass '#' jahat di href, yang akan hidup pada indeks 0.Satu-satunya persyaratan adalah bahwa Anda memanggil pada
<a>
, karena elemen tersebut mengasumsikan keberadaanhref
atribut, yang akan dibandingkan dengan jalur saat ini. Namun, Anda dapat beradaptasi dengan cukup mudah untuk membaca / menulis elemen induk atau anak, jika Anda lebih suka memohon pada<li>
sesuatu atau sesuatu. Saya menggali ini karena Anda dapat menggunakannya kembali dalam banyak konteks hanya dengan memvariasikan argumen pathLevel. Jika kedalaman untuk membaca diasumsikan dalam logika, Anda perlu beberapa versi dari direktif untuk digunakan dengan beberapa bagian navigasi.EDIT 3/18/14: Solusinya tidak cukup digeneralisasi, dan akan aktif jika Anda mendefinisikan argumen untuk nilai 'activeTab' yang mengembalikan
undefined
keduanya$location.path()
, dan elemenhref
. Karena:undefined === undefined
. Diperbarui untuk memperbaiki kondisi itu.Saat mengerjakannya, saya menyadari seharusnya ada versi yang bisa Anda deklarasikan pada elemen induk, dengan struktur template seperti ini:
Perhatikan bahwa versi ini tidak lagi menyerupai HTML gaya Bootstrap. Tapi, ini lebih modern dan menggunakan lebih sedikit elemen, jadi saya tidak setuju. Versi direktif ini, plus yang asli, sekarang tersedia di Github sebagai modul drop-in yang bisa Anda nyatakan sebagai dependensi. Saya akan senang untuk Bower-ize mereka, jika ada yang benar-benar menggunakannya.
Juga, jika Anda menginginkan versi yang kompatibel dengan bootstrap yang menyertakannya
<li>
, Anda dapat menggunakan modul angular-ui-bootstrap Tab , yang saya pikir keluar setelah posting asli ini, dan yang mungkin bahkan lebih deklaratif daripada yang ini. Ini kurang ringkas untuk hal-hal dasar, tetapi memberi Anda beberapa opsi tambahan, seperti tab yang dinonaktifkan dan acara deklaratif yang diaktifkan dan dinonaktifkan.sumber
ul
sama sekali, dan mungkin hanya koleksi jangkar, dibungkus olehnav
elemen pengelompokan atau lainnya. Berurusan dengan lapisan perantarali
ditambahkan kompleksitas tanpa imbalan, terutama sekarang kita memilikinav
elemen yang kita miliki untuk memperjelas apa yang terjadi.@ rob-juurlink Saya sedikit memperbaiki solusi Anda:
alih-alih setiap rute membutuhkan tab aktif; dan perlu mengatur tab aktif di setiap controller saya melakukan ini:
Dan HTMLnya terlihat seperti ini. Activetab hanyalah url yang terkait dengan rute itu. Ini hanya menghilangkan kebutuhan untuk menambahkan kode di setiap controller (menyeret dependensi seperti $ route dan $ rootScope jika ini adalah satu-satunya alasan mereka digunakan)
sumber
Mungkin arahan seperti ini dapat menyelesaikan masalah Anda: http://jsfiddle.net/p3ZMR/4/
HTML
JS
sumber
Solusi paling sederhana di sini:
Bagaimana cara mengatur kelas aktif bootstrap navbar dengan Angular JS?
Yang mana:
Gunakan ng-controller untuk menjalankan satu kontroler di luar tampilan-ng:
dan sertakan di controllers.js:
sumber
Saya sarankan menggunakan modul state.ui yang tidak hanya mendukung pandangan banyak dan bersarang tetapi juga membuat jenis pekerjaan ini sangat mudah (kode di bawah ini dikutip):
Layak dibaca.
sumber
Berikut adalah versi lain dari XMLillies dengan perubahan LI domi yang menggunakan string pencarian alih-alih tingkat jalur. Saya pikir ini sedikit lebih jelas apa yang terjadi pada use case saya.
HTML sekarang terlihat seperti:
sumber
Saya menemukan anwser XMLilley yang terbaik dan paling mudah beradaptasi dan tidak mengganggu.
Namun saya memiliki kesalahan kecil.
Untuk digunakan dengan bootstrap nav, berikut adalah cara saya memodifikasinya:
Saya menambahkan "if (attrs.href! = Undefined)" karena fungsi ini dipanggil dua kali, yang kedua kalinya menghasilkan kesalahan.
Adapun html:
sumber
Contoh bootstrap.
Jika Anda menggunakan Angulars built in routing (ngview) arahan ini dapat digunakan:
Dengan asumsi markup Anda terlihat seperti ini:
Saya suka ini karena saya dapat mengatur nama kelas yang Anda inginkan di atribut Anda.
sumber
Anda juga dapat dengan mudah menyuntikkan lokasi ke dalam ruang lingkup dan menggunakannya untuk mengurangi gaya navigasi:
Kemudian gunakan di
ng-class
:sumber
cara alternatif adalah menggunakan ui-sref-active
Arahan yang bekerja bersama ui-sref untuk menambahkan kelas ke elemen ketika status direktif ui-sref terkait aktif, dan menghapusnya saat tidak aktif. Kasus penggunaan utama adalah menyederhanakan tampilan khusus menu navigasi yang mengandalkan ui-sref, dengan membuat tombol menu status "aktif" tampak berbeda, membedakannya dari item menu yang tidak aktif.
Pemakaian:
ui-sref-active = 'class1 class2 class3' - class "class1", "class2", dan "class3" masing-masing ditambahkan ke elemen direktif ketika keadaan ui-sref terkait aktif, dan dihapus ketika tidak aktif.
Contoh:
Diberikan templat berikut,
ketika status aplikasi adalah "app.user", dan berisi parameter status "pengguna" dengan nilai "bilbobaggins", HTML yang dihasilkan akan muncul sebagai
Nama kelas diinterpolasi satu kali selama arahan tautan waktu (setiap perubahan lebih lanjut ke nilai interpolasi diabaikan). Beberapa kelas dapat ditentukan dalam format yang dipisahkan ruang.
Gunakan direktif ui-sref-opts untuk meneruskan opsi ke $ state.go (). Contoh:
sumber
Saya setuju dengan posting Rob tentang memiliki atribut khusus di controller. Rupanya saya tidak punya cukup perwakilan untuk berkomentar. Inilah jsfiddle yang diminta:
contoh html
contoh app.js
http://jsfiddle.net/HrdR6/
sumber
Dan gunakan yang di bawah ini dalam templat:
sumber
Saya membutuhkan solusi yang tidak memerlukan perubahan pada controller, karena untuk beberapa halaman kami hanya membuat template dan tidak ada controller sama sekali. Berkat komentator sebelumnya yang menyarankan menggunakan
$routeChangeSuccess
saya datang dengan sesuatu seperti ini:Itu tidak tergantung pada URL dan karenanya sangat mudah untuk mengaturnya untuk setiap sub halaman dll.
sumber
Saya tidak ingat di mana saya menemukan metode ini, tetapi cukup sederhana dan berfungsi dengan baik.
HTML:
CSS:
sumber
Jika Anda menggunakan ngRoute (untuk perutean) maka aplikasi Anda akan memiliki konfigurasi di bawah,
Sekarang, tambahkan saja controller dalam konfigurasi ini seperti di bawah ini,
Seperti yang telah Anda sebutkan tab aktif di konfigurasi Anda, sekarang Anda hanya perlu menambahkan kelas aktif di tag
<li>
atau Anda<a>
. Suka,Yang berarti, setiap kali pengguna mengklik pada halaman, ini akan secara otomatis mengidentifikasi tab saat ini dan menerapkan kelas css aktif.
Saya harap ini membantu!
sumber
Datang ke sini untuk solusi .. meskipun solusi di atas berfungsi dengan baik tetapi menemukan mereka sedikit rumit tidak perlu. Bagi orang yang masih mencari solusi yang mudah dan rapi, itu akan melakukan tugas dengan sempurna.
sumber