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.