Ok, entonces sabemos que ng-deep no es la mejor práctica, y sabemos que ViewEncapsulation.None se vuelve asqueroso. Así que aquí está mi pregunta, lo que quiero hacer es esto.
Digamos que tengo un componente con;
@Input() cssClasses: string;
Luego, en el componente principal que lo usa, hago algo como;
<my-component [cssClasses]="some-css-class some-other-css-class"></my-component>
Ahora, donde se pasan esas clases, quiero agregar la identificación del selector generado por los componentes a esas clases para que cuando se representen en el DOM coincidan con las clases css del componente consumidor como la salida que veríamos del componente secundario;
<div class="class1 class2 some-css-class some-other-css-class"></div>
El problema aquí es obviamente que viewEncapsulation adjuntará al selector de ID del componente las clases del componente, pero NO las que se le pasan. Entonces, sin ng-deep o colocando las clases en un archivo css de inicio de nivel superior, no se aplicarán porque los selectores salen así;
[_ngStuff-blah-123] .class1 {...} [_ngStuff-blah-123] .class2 {...} Pero dado que some-css-class some-other-css-class nunca obtiene el selector de id de la clase css derivada a través de @Input del niño, en realidad no se aplican. A menos que se declaren, tiene ng-deep o si está en un css de nivel superior que no está conectado a otro componente o lo que sea.
¿Cómo se agrega el contexto del componente de consumo para que termine con una salida como;
[_ngStuff-blah-123] .class1 {...} [_ngStuff-blah-123] .class2 {...} [_ngStuff-parent-999] [_ngStuff-blah-123] .some-css-class {...} [_ngStuff-parent-999] [_ngStuff-blah-123] .some-other-css-class {...} ¿En lugar de simplemente usar ngStyle , ng-deep o inicio de nivel superior?
¿Hay alguna manera de que pueda hacer algo cuando uso el componente secundario como;
<my-component [cssClasses]="some-css-class some-other-css-class" [hostContext]="this.parent.idContext"></my-component>
¿Para que la salida DOM se parezca al ejemplo anterior y podamos utilizar algún paso de clase específico de instancia SIN ng-deep etc.? Seguramente no soy el primero en preguntar, así que disculpas si esto es un duplicado.
Desea usar host-context que le da estilo al niño en función de las clases CSS en el padre, no es necesario pasar las clases. Esencialmente, funciona de esta manera. Aquí está el CSS en el componente secundario:
:host-context(.wrapper-blue) .hello { color: blue } :host-context(.wrapper-red) .hello { color: red }HTML en el niño:
<div class="hello"> hello <!-- color depends on the class wrapping me in the parent --> </div>Y el HTML en el padre se ve así:
<div class="wrapper-red"> <app-child-component><app-child-component> </div> <div class="wrapper-blue"> <app-child-component><app-child-component> </div> Ha pasado un tiempo desde que usé esto, por lo que mi sintaxis puede estar un poco mal, pero entiendes la idea. Google Angular host-context y encontrará lo que necesita. O mira aquí estas publicaciones SO:
¿Cuál es el caso de uso de: selector de contexto de host en angular?
No puedo entender el uso de: host en componentes en Angular2
Buena publicación aquí que parece mejor que las otras:
https://blog.angular-university.io/angular-host-context/#thehostcontextpseudoclasselector
¡Aquí están los documentos oficiales que prueban que NO está obsoleto!