Apa cara yang tepat / diterima untuk menggunakan stylesheet terpisah untuk berbagai tampilan yang digunakan aplikasi saya?
Saat ini saya menempatkan elemen tautan di tampilan / html parsial di bagian atas tetapi saya telah diberitahu ini adalah praktik yang buruk meskipun semua browser modern mendukungnya tetapi saya dapat melihat mengapa itu disukai.
Kemungkinan lain adalah menempatkan stylesheet yang terpisah di index.html saya, head
tetapi saya ingin itu hanya memuat stylesheet jika pandangannya dimuat atas nama kinerja.
Apakah praktik buruk ini karena penataan tidak akan berlaku hingga setelah css dimuat dari server, yang mengarah ke flash cepat konten yang tidak diformat dalam browser yang lambat? Saya belum menyaksikan ini meskipun saya sedang mengujinya secara lokal.
Apakah ada cara untuk memuat CSS melalui objek yang diteruskan ke Angular $routeProvider.when
?
Terima kasih sebelumnya!
sumber
<link>
tag css dalam format ini , dengan Chrome terbaru, server di mesin lokal saya (dan "Nonaktifkan cache" untuk mensimulasikan kondisi "memuat pertama"). Saya membayangkan bahwa pra-menyisipkan<style>
tag di parsial html di server akan menghindari masalah ini.Jawaban:
Saya tahu pertanyaan ini sudah tua sekarang, tetapi setelah melakukan banyak penelitian tentang berbagai solusi untuk masalah ini, saya pikir saya mungkin telah menemukan solusi yang lebih baik.
Jika ada orang di masa depan yang tertarik, inilah yang saya temukan:
1. Buat arahan khusus untuk
<head>
elemen:Arahan ini melakukan hal-hal berikut:
$compile
) string html yang membuat satu set<link />
tag untuk setiap item dalamscope.routeStyles
objek menggunakanng-repeat
danng-href
.<link />
elemen yang dikompilasi ke<head>
tag.$rootScope
untuk mendengarkan'$routeChangeStart'
acara. Untuk setiap'$routeChangeStart'
peristiwa, ia mengambil objek "saat ini"$$route
(rute yang akan ditinggalkan pengguna) dan menghapus file css parsial-spesifik dari<head>
tag. Ia juga mengambil objek "berikutnya"$$route
(rute yang akan dituju pengguna) dan menambahkan file css parsial-spesifik ke<head>
tag.ng-repeat
bagian dari<link />
tag yang dikompilasi menangani semua penambahan dan penghapusan stylesheet khusus halaman berdasarkan apa yang ditambahkan atau dihapus dariscope.routeStyles
objek.Catatan: ini mensyaratkan bahwa
ng-app
atribut Anda ada pada<html>
elemen, bukan pada<body>
atau apa pun di dalamnya<html>
.2. Tentukan stylesheet mana yang termasuk dalam rute yang menggunakan
$routeProvider
:Konfigurasi ini menambahkan
css
properti kustom ke objek yang digunakan untuk mengatur rute setiap halaman. Objek itu diteruskan ke setiap'$routeChangeStart'
peristiwa sebagai.$$route
. Jadi saat mendengarkan'$routeChangeStart'
acara, kita dapat mengambilcss
properti yang telah kita tentukan dan menambahkan / menghapus<link />
tag tersebut sesuai kebutuhan. Perhatikan bahwa menentukancss
properti pada rute sepenuhnya opsional, karena dihilangkan dari'/some/route/2'
contoh. Jika rute tidak memilikicss
properti,<head>
arahan hanya akan melakukan apa pun untuk rute itu. Perhatikan juga bahwa Anda bahkan dapat memiliki beberapa stylesheet khusus halaman per rute, seperti pada'/some/route/3'
contoh di atas, di manacss
properti adalah array jalur relatif ke stylesheet yang diperlukan untuk rute itu.3. Anda selesai Kedua hal mengatur semua yang diperlukan dan itu melakukannya, menurut saya, dengan kode terbersih mungkin.
Semoga itu bisa membantu orang lain yang mungkin berjuang dengan masalah ini sebanyak saya.
sumber
index.html
file Anda . Jadi pada contoh di atas,index.html
akan berada di root dancss
folder akan di root, berisi semua file css. tetapi Anda dapat menyusun aplikasi sesuai keinginan Anda, selama Anda menggunakan jalur relatif yang benar.angular.forEach(current.$$route.css, function(sheet){ delete scope.routeStyles[sheet]; });
.Solusi @ tennisgent sangat bagus. Namun, saya pikir agak terbatas.
Modularitas dan Enkapsulasi di Angular melampaui rute. Berdasarkan cara web bergerak menuju pengembangan berbasis komponen, penting untuk menerapkan ini dalam arahan juga.
Seperti yang sudah Anda ketahui, di Angular kami dapat menyertakan templat (struktur) dan pengontrol (perilaku) di halaman dan komponen. AngularCSS memungkinkan bagian yang hilang terakhir: melampirkan stylesheet (presentasi).
Untuk solusi lengkap saya sarankan menggunakan AngularCSS.
ng-app
dalam<html>
tag. Ini penting ketika Anda memiliki beberapa aplikasi yang berjalan di halaman yang samahttps://github.com/door3/angular-css
Berikut ini beberapa contohnya:
Rute
Arahan
Selain itu, Anda dapat menggunakan
$css
layanan untuk kasus tepi:Anda dapat membaca lebih lanjut tentang AngularCSS di sini:
http://door3.com/insights/introducing-angularcss-css-demand-angularjs
sumber
Bisa menambahkan stylesheet baru ke dalam
$routeProvider
. Untuk kesederhanaan saya menggunakan string tetapi bisa membuat elemen tautan baru juga, atau membuat layanan untuk stylesheetManfaat terbesar prelaoding di halaman adalah gambar latar belakang apa pun sudah ada, dan kurang lieklyhood
FOUC
sumber
<link>
di<head>
dalam index.html secara statis?when
untuk rute belum dipanggil. Dapat memasukkan kode ini dalamcontroller
panggilan balikwhen
dalamrouteProvider
, atau mungkin dalamresolve
panggilan balik yang kemungkinan akan memicu lebih cepatrouteprovider
... komentar itu tentang memasukkannya di kepala halaman utama ketika halaman disajikan@ sz3, cukup lucu hari ini saya harus melakukan persis apa yang Anda coba capai: ' memuat file CSS tertentu hanya ketika pengguna mengakses ' halaman tertentu. Jadi saya menggunakan solusi di atas.
Tetapi saya di sini untuk menjawab pertanyaan terakhir Anda: 'di mana tepatnya saya harus meletakkan kodenya. Ada ide ? '
Anda benar memasukkan kode ke tekad , tetapi Anda perlu mengubah sedikit format.
Lihatlah kode di bawah ini:
Saya baru saja menguji dan berfungsi dengan baik , menyuntikkan html dan memuat 'home.css' saya hanya ketika saya menekan rute '/ home'.
Penjelasan lengkap dapat ditemukan di sini , tetapi pada dasarnya menyelesaikan: harus mendapatkan objek dalam format
Anda dapat memberi nama ' kunci ' apa pun yang Anda suka - dalam kasus saya, saya menyebutnya ' gaya '.
Kemudian untuk nilai Anda memiliki dua opsi:
Jika sebuah string , maka itu adalah alias untuk layanan.
Jika fungsinya , maka itu disuntikkan dan nilai kembali diperlakukan sebagai ketergantungan.
Poin utama di sini adalah bahwa kode di dalam fungsi akan dieksekusi sebelum sebelum controller dipakai dan event $ routeChangeSuccess dipecat.
Semoga itu bisa membantu.
sumber
Luarbiasa, terimakasih!! Hanya perlu membuat beberapa penyesuaian agar bisa berfungsi dengan ui-router:
sumber
Jika Anda hanya perlu CSS untuk diterapkan pada satu tampilan tertentu, saya menggunakan cuplikan praktis ini di dalam controller saya:
Ini akan menambahkan kelas ke
body
tag saya ketika status dimuat, dan menghapusnya ketika status dihancurkan (yaitu seseorang mengubah halaman). Ini memecahkan masalah terkait saya hanya membutuhkan CSS untuk diterapkan ke satu negara dalam aplikasi saya.sumber
'gunakan yang ketat'; angular.module ('app') .run (['$ rootScope', '$ state', '$ stateParams', fungsi ($ rootScope, $ state, $ stateParams) {$ rootScope. $ state = $ state; $ rootScope . $ stateParams = $ stateParams;}]) .config (['$ stateProvider', '$ urlRouterProvider', fungsi ($ stateProvider, $ urlRouterProvider) {
sumber