Angolare 2: come definire lo stile dell'elemento host del componente?


189

Ho un componente in Angular 2 chiamato my-comp:

<my-comp></my-comp>

In che modo uno stile l'elemento host di questo componente in Angular 2?

In Polimero, useresti il ​​selettore ": host". L'ho provato in Angular 2. Ma non funziona.

:host {
  display: block;
  width: 100%;
  height: 100%;
}

Ho anche provato a utilizzare il componente come selettore:

my-comp {
  display: block;
  width: 100%;
  height: 100%;
}

Entrambi gli approcci non sembrano funzionare.

Grazie.


2
Sei sicuro che lo stile non sia applicato? Ho realizzato un progetto di base, ho fatto esattamente questo e ha funzionato. Ho impostato il my-selector { color : red}mio CSS e funziona benissimo.
— Pacane,

1
A partire da beta 7, il selettore: host funziona per me.
— Jon Swanson

Risposte:


285

Si è verificato un errore, ma nel frattempo è stato risolto. :host { }funziona bene ora.

Sono supportati anche

  • :host(selector) { ... }per selectorabbinare attributi, classi, ... sull'elemento host
  • :host-context(selector) { ... }per selectorabbinare elementi, classi, ... sui componenti principali

  • selector /deep/ selector(alias selector >>> selectornon funziona con SASS) affinché gli stili corrispondano ai limiti degli elementi

    • AGGIORNAMENTO: SASS sta deprecando /deep/.
      Angolare (TS e Dart) aggiunto ::ng-deepin sostituzione compatibile anche con SASS.

    • UPDATE2: ::slotted ::slotted ora è supportato da tutti i nuovi browser e può essere utilizzato con `ViewEncapsulation.ShadowDom
      https://developer.mozilla.org/en-US/docs/Web/CSS/::slotted

Vedi anche Carica stile CSS esterno in Angular 2 Component

/deep/e non>>> sono interessati dagli stessi combinatori di selettori che in Chrome sono obsoleti.
Angular li emula (riscrive) e quindi non dipende dai browser che li supportano.

Questo è anche il motivo /deep/e >>>non funziona con ViewEncapsulation.Nativecui abilita il DOM shadow nativo e dipende dal supporto del browser.


@Component({selector: 'some-selector', template: 'xxx', styles: [':host { display: block; background-color: green; border: solid 1px red; }']}) export class SomeClass {}
— Günter Zöchbauer,

@ OndraŽižka puoi approfondire? Questo è puro CSS, come può essere incoerente con CSS e se stesso?
— Günter Zöchbauer,

A meno che non abbia perso alcuni importanti cambiamenti nel CSS, / deep / e >>> non sono CSS.
— Ondra Žižka,

Sono deprecati, ma non importa. Sono emulati da Angular (riscritto), quindi funzionano solo con ViewEncapsularion.Emulated(impostazione predefinita) ma non con Native.
— Günter Zöchbauer,

In Angular 2.4.7 sono in grado :host { p { font-size: 80%; } }di lavorare in un file ... component.css. Non appena provo ad usarlo styles: [:host { p { font-size: 80%; } }]non funziona più. Molto strano.
— Martin,

39

Ho trovato una soluzione su come modellare solo l'elemento componente. Non ho trovato alcuna documentazione su come funzioni, ma puoi inserire i valori degli attributi nella direttiva componente, sotto la proprietà 'host' come questa:

@Component({
    ...
    styles: [`
      :host {
        'style': 'display: table; height: 100%',
        'class': 'myClass'
      }`
})
export class MyComponent
{
    constructor() {}

    // Also you can use @HostBinding decorator
    @HostBinding('style.background-color') public color: string = 'lime';
    @HostBinding('class.highlighted') public highlighted: boolean = true;
}

AGGIORNAMENTO: Come menzionato da Günter Zöchbauer, c'era un bug e ora puoi modellare l'elemento host anche nel file css, in questo modo:

:host{ ... }

1
Mi piace di più che creare un fittizio elemento .root, ma non mi piace che imposta questi stili come in linea (costringendo a !importanta sovrascrivere). Deve esserci un migliore waayy: \
— Scrimothy

4
no, lo styling tramite host{}in un stylesUrlfile non funziona. esigenze :host.
— phil294,

come possiamo accedere alla variabile componente all'interno dell'host? Se voglio decidere il colore di sfondo in modo dinamico? ': host {background-color: this.bgColor; } '
— Pratap AK

@ PratapA.K Ciao, puoi usare il deroratore di HostBinding. Il tuo esempio sarà: @HostBinding('style.background-color') private color = 'lime'; Google ti troverà molti esempi e articoli.
— prespic

11

Dai un'occhiata a questo problema . Penso che il bug verrà risolto quando verrà implementata la nuova logica di precompilazione del modello . Per ora penso che il meglio che puoi fare sia avvolgere il tuo modello <div class="root">e modellarlo div:

@Component({ ... })
@View({
  template: `
    <div class="root">
      <h2>Hello Angular2!</h2>
      <p>here is your template</p>
    </div>
  `,
  styles: [`
    .root {
      background: blue;
    }
  `],
   ...
})
class SomeComponent {}

Vedi questo plunker


9

Nel componente è possibile aggiungere .class all'elemento host se si desidera applicare alcuni stili generali.

export class MyComponent{
     @HostBinding('class') classes = 'classA classB';

6

Per chiunque cerchi di dare uno stile agli elementi figlio di un :hostqui è un esempio di come usare::ng-deep

:host::ng-deep <child element>

per esempio :host::ng-deep span { color: red; }

Come altri hanno detto /deep/è deprecato


4

Prova il: host> / deep /:

Aggiungi quanto segue al file parent.component.less

:host {
    /deep/ app-child-component {
       //your child style
    }
}

Sostituisci il componente app-child con il tuo selettore figlio


Cosa succede se si desidera un foglio di stile come bootstrap lì invece di un singolo stile?
— Aditya Vikas Devarapalli,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.