Saya punya komponen induk:
<parent></parent>
Dan saya ingin mengisi grup ini dengan komponen anak:
<parent>
<child></child>
<child></child>
<child></child>
</parent>
Templat induk:
<div class="parent">
<!-- Children goes here -->
<ng-content></ng-content>
</div>
Template anak:
<div class="child">Test</div>
Karena parent
dan child
dua komponen yang terpisah, gaya mereka dikunci ke ruang lingkup mereka sendiri.
Pada komponen induk saya, saya mencoba melakukan:
.parent .child {
// Styles for child
}
Tetapi .child
gaya tidak diterapkan pada child
komponen.
Saya mencoba menggunakan styleUrls
untuk memasukkan parent
stylesheet ke dalam child
komponen untuk menyelesaikan masalah lingkup:
// child.component.ts
styleUrls: [
'./parent.component.css',
'./child.component.css',
]
Tapi itu tidak membantu, juga mencoba cara lain dengan mengambil child
stylesheet, parent
tetapi itu juga tidak membantu.
Jadi bagaimana Anda mengatur komponen anak yang dimasukkan ke dalam komponen induk?
css
angular
angular-components
Chrillewoodz
sumber
sumber
Jawaban:
Perbarui - Cara Terbaru
Jangan lakukan itu, jika Anda bisa menghindarinya. Seperti yang ditunjukkan Devon Sans dalam komentar: Fitur ini kemungkinan besar akan ditinggalkan.
Perbarui - Cara Baru
Dari Angular 4.3.0 , semua kombinator penindik css sudah usang. Tim sudut memperkenalkan combinator baru
::ng-deep
(masih di level eksperimental dan bukan cara penuh dan final) seperti yang ditunjukkan di bawah ini,DEMO: https://plnkr.co/edit/RBJIszu14o4svHLQt563?p=preview
Cara lama
Anda dapat menggunakan
encapsulation mode
dan / ataupiercing CSS combinators >>>, /deep/ and ::shadow
contoh kerja: http://plnkr.co/edit/1RBDGQ?p=preview
sumber
::ng-deep
sekarang sudah usang , saya tidak merekomendasikan menggunakannya dalam aplikasi masa depanPEMBARUAN 3:
::ng-deep
juga sudah usang yang berarti Anda tidak boleh melakukan ini sama sekali lagi. Tidak jelas bagaimana hal ini memengaruhi hal-hal di mana Anda perlu mengganti gaya pada komponen anak dari komponen induk. Bagi saya rasanya aneh jika ini dihapus sepenuhnya karena bagaimana hal ini akan memengaruhi hal-hal sebagai pustaka di mana Anda perlu mengganti gaya dalam komponen pustaka?Beri komentar jika Anda memiliki wawasan tentang hal ini.
PEMBARUAN 2:
Karena
/deep/
dan semua penyeleksi penusuk bayangan lainnya sekarang sudah usang. Penurunan sudut::ng-deep
yang harus digunakan sebagai gantinya untuk kompatibilitas yang lebih luas.MEMPERBARUI:
Jika menggunakan Angular-CLI, Anda harus menggunakan
/deep/
alih-alih>>>
jika tidak, itu tidak akan berfungsi.ASLI:
Setelah membuka halaman Github Angular2 dan melakukan pencarian acak untuk "style", saya menemukan pertanyaan ini: Angular 2 - styleHTML styling
Yang dikatakan menggunakan sesuatu yang ditambahkan
2.0.0-beta.10
,>>>
dan::shadow
penyeleksi.Jadi cukup lakukan:
Dalam
parent
's berkas stylesheet memecahkan masalah. Harap dicatat, seperti yang dinyatakan dalam kutipan di atas, solusi ini hanya bersifat sementara hingga penataan komponen silang yang lebih maju didukung.sumber
Anda TIDAK boleh menggunakan
::ng-deep
, itu sudah usang. Di Angular, cara yang tepat untuk mengubah gaya komponen anak-anak dari orang tua adalah dengan menggunakanencapsulation
(baca peringatan di bawah ini untuk memahami implikasinya):Dan kemudian, Anda akan dapat memodifikasi bentuk css komponen Anda tanpa perlu dari :: ng-deep
PERINGATAN: Melakukan ini akan membuat semua aturan css yang Anda tulis untuk komponen ini menjadi global.
Untuk membatasi ruang lingkup css Anda hanya untuk komponen ini, tambahkan kelas css ke tag atas komponen Anda dan letakkan css Anda "di dalam" tag ini:
File scss:
sumber
::ng-deep
. Secara umum, komponen memiliki pemilihnya sendiri (<my-component>, <div my-component>
, dll.) Sehingga bahkan tidak perlu elemen pembungkus dengan kelas khusus.Sayangnya tampaknya / deep / selector sudah usang (setidaknya di Chrome) https://www.chromestatus.com/features/6750456638341120
Singkatnya tampaknya ada (saat ini) tidak ada solusi jangka panjang selain untuk entah bagaimana membuat komponen anak Anda untuk gaya hal-hal secara dinamis.
Anda dapat mengirimkan objek gaya ke anak Anda dan menerapkannya melalui:
<div [attr.style]="styleobject">
Atau jika Anda memiliki gaya tertentu, Anda dapat menggunakan sesuatu seperti:
<div [style.background-color]="colorvar">
Diskusi lebih lanjut terkait dengan ini: https://github.com/angular/angular/issues/6511
sumber
Punya masalah yang sama, jadi jika Anda menggunakan angular2-cli dengan scss / sass gunakan '/ deep /' bukan '>>>', pemilih terakhir belum didukung (tetapi berfungsi baik dengan css).
sumber
Jika Anda ingin lebih ditargetkan ke komponen anak yang sebenarnya daripada yang harus Anda lakukan ikuti. Dengan cara ini, jika komponen anak lainnya berbagi nama kelas yang sama, mereka tidak akan terpengaruh.
Plunker: https://plnkr.co/edit/ooBRp3ROk6fbWPuToytO?p=preview
Sebagai contoh:
Semoga ini membantu!
codematrix
sumber
Sebenarnya ada satu opsi lagi. Yang agak aman. Anda dapat menggunakan ViewEncapsulation.None TAPI TETAPI menempatkan semua gaya komponen Anda ke dalam tag-nya (alias pemilih). Tapi bagaimanapun juga selalu lebih suka beberapa gaya global plus gaya enkapsulasi.
Berikut dimodifikasi contoh Denis Rybalka:
sumber
Ada beberapa opsi untuk mencapai ini di Angular:
1) Anda dapat menggunakan penyeleksi css dalam
2) Anda juga dapat mengubah tampilan enkapsulasi yang disetel ke Emulated sebagai default tetapi dapat dengan mudah diubah menjadi Native yang menggunakan implementasi browser asli Shadow DOM, jika Anda hanya perlu menonaktifkannya
Misalnya: `
sumber
Anda tidak boleh menulis aturan CSS untuk elemen komponen anak di komponen induk, karena komponen Angular adalah entitas mandiri yang harus secara eksplisit menyatakan apa yang tersedia untuk dunia luar. Jika tata letak anak berubah di masa mendatang, gaya Anda untuk elemen komponen anak yang tersebar di file SCSS komponen lain dapat dengan mudah dipecah, sehingga membuat gaya Anda sangat rapuh. Itu untuk apa
ViewEncapsulation
dalam kasus CSS. Jika tidak, akan sama jika Anda bisa menetapkan nilai ke bidang pribadi beberapa kelas dari kelas lain di Pemrograman Berorientasi Objek.Oleh karena itu, apa yang harus Anda lakukan adalah mendefinisikan sekumpulan kelas yang dapat Anda terapkan pada elemen host anak dan mengimplementasikan bagaimana anak meresponsnya.
Secara teknis, itu bisa dilakukan sebagai berikut:
Dengan kata lain, Anda menggunakan
:host
pseudo-selector yang disediakan oleh Angular + set kelas CSS untuk menentukan kemungkinan style anak dalam komponen child itu sendiri. Anda kemudian memiliki kemampuan untuk memicu gaya-gaya tersebut dari luar dengan menerapkan kelas yang telah ditentukan sebelumnya ke<child>
elemen host.sumber
parent.component.scss
terkait dengan gaya komponen anak. Ini satu-satunya tujuan dari pendekatan ini. Mengapa Anda perluparent.component.scss
?ViewEncapsulation
hanya karena nilai standarnya adalah apa yang mengarah ke pertanyaan OP. Anda tidak perlu menetapkan yang lainViewEncapsulation
agar kode di atas berfungsi.Saya merasa jauh lebih bersih untuk melewatkan variabel @INPUT jika Anda memiliki akses ke kode komponen :
Idenya adalah bahwa orang tua memberi tahu anak itu seperti apa penampilannya, dan anak itu memutuskan bagaimana menampilkan keadaan itu. Ini arsitektur yang bagus
Cara SCSS:
Cara yang lebih baik: - gunakan
selected
variabel:sumber
Pada hari ini (Angular 9), Angular menggunakan Shadow DOM untuk menampilkan komponen sebagai elemen HTML khusus . Salah satu cara elegan untuk menata elemen khusus tersebut mungkin menggunakan variabel CSS khusus . Ini adalah contoh umum:
Seperti yang dapat kita lihat dari kode di atas, kita membuat elemen kustom, seperti yang akan dilakukan Angular untuk kita dengan setiap komponen, dan kemudian kita menimpa variabel yang bertanggung jawab atas warna latar belakang dalam akar bayangan elemen kustom, dari lingkup global .
Di aplikasi Angular, ini mungkin seperti:
parent.component.scss
child-element.component.scss
sumber
Jawaban singkatnya adalah Anda seharusnya tidak melakukan ini sama sekali. Ini merusak enkapsulasi komponen dan merusak manfaat yang Anda dapatkan dari komponen mandiri. Pertimbangkan untuk mengirimkan flag prop ke komponen child, ia kemudian dapat memutuskan sendiri bagaimana me-render secara berbeda atau menerapkan CSS yang berbeda, jika perlu.
Angular mencela semua cara untuk mempengaruhi gaya anak dari orang tua.
https://angular.io/guide/component-styles#deprecated-deep--and-ng-deep
sumber
Saya juga memiliki masalah ini dan tidak ingin menggunakan solusi usang sehingga saya akhirnya dengan:
di parrent
komponen anak
pada anak di html div
dan dalam kode
bekerja seperti yang diharapkan dan tidak boleh ditinggalkan;)
sumber
Sebagai pembaruan internet saya menemukan solusi.
Pertama, beberapa peringatan.
Pertama, tandai enkapsulasi komponen anak Anda sebagai bayangan sehingga ditampilkan dalam dom bayangan sebenarnya. Kedua, tambahkan atribut bagian ke elemen yang ingin Anda biarkan orang tua untuk gaya. Dalam stylesheet komponen orang tua Anda, Anda dapat menggunakan metode :: part () untuk mengakses
sumber
Saya mengusulkan contoh untuk membuatnya lebih jelas, karena angular.io/guide/component-styles menyatakan:
Aktif
app.component.scss
, impor Anda*.scss
jika perlu._colors.scss
memiliki beberapa nilai warna umum:Terapkan aturan ke semua komponen
Semua tombol yang memiliki
btn-red
kelas akan ditata.Terapkan aturan ke satu komponen
Semua tombol yang memiliki
btn-red
kelas padaapp-login
komponen akan ditata.sumber
Saya telah menyelesaikannya di luar Angular. Saya telah menetapkan scss bersama yang saya impor ke anak-anak saya.
shared.scss
child.scss
Pendekatan yang saya usulkan adalah cara bagaimana menyelesaikan masalah yang ditanyakan OP. Seperti yang disebutkan pada beberapa kesempatan, :: ng-deep,: ng-host akan terdepresiasi dan menonaktifkan enkapsulasi adalah terlalu banyak kebocoran kode, dalam pandangan saya.
sumber