Angular 2: Comment styliser l'élément hôte du composant?

j'ai de la composante Angulaire 2 appelé mon-comp:

<my-comp></my-comp>

comment styliser L'élément hôte de ce composant en angle 2?

en polymère, vous utiliserez le sélecteur": host". J'ai essayé en angle 2. Mais ça ne fonctionne pas.

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

j'ai aussi essayé d'utiliser le composant sélecteur:

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

les Deux approches ne semblent pas fonctionner.

Merci.

138
demandé sur Günter Zöchbauer 2015-09-30 00:17:12

6 réponses

il y avait un bug, mais il a été corrigé dans l'intervalle. :host { } fonctionne bien maintenant.

sont également pris en charge sont

  • :host(selector) { ... } pour selector afin de faire correspondre les attributs, classes ... sur l'élément hôte
  • :host-context(selector) { ... } pour selector pour correspondre à des éléments, des classes, des ...sur les composants parents

  • selector /deep/ selector (alias selector >>> selector ne fonctionne pas avec SASS) pour que les styles correspondent au-delà des limites des éléments

    • mise à jour: SASS déprécie /deep/ .

      Angular (TS et Dart) a ajouté ::ng-deep comme remplacement qui est également compatible avec SASS.

    • UPDATE2: ::slotted ::slotted est maintenant supporté par tous les nouveaux les navigateurs et peut être utilisé avec `ViewEncapsulation.ShadowDom

      https://developer.mozilla.org/en-US/docs/Web/CSS/::slotted

Voir aussi charger le style CSS externe en composante angulaire 2

/deep/ et >>> sont pas touché par le même sélecteur combinators que dans Chrome qui sont obsolètes.

Angular les émule (les réécrit), et ne dépend donc pas des navigateurs qui les supportent.

C'est aussi la raison pour laquelle /deep/ et >>> ne fonctionnent pas avec ViewEncapsulation.Native qui permet le DOM shadow natif et dépend du support du navigateur.

227
répondu Günter Zöchbauer 2018-09-15 09:03:37

j'ai trouvé une solution pour ne styliser que l'élément composant. Je n'ai pas trouvé de documentation sur la façon dont cela fonctionne, mais vous pouvez mettre des valeurs d'attributs dans la directive component, sous la propriété 'host' comme ceci:

@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;
}

mise à jour: Comme Günter Zöchbauer l'a mentionné, il y avait un bug, et maintenant vous pouvez style l'élément hôte même dans le fichier css, comme ceci:

:host{ ... }
26
répondu prespic 2018-03-28 15:02:34

Check out cette question . Je pense que le bogue sera résolu lorsque nouvelle logique de précompilation de modèle sera implémentée. Pour l'instant, je pense que le mieux que vous pouvez faire est d'envelopper votre modèle dans <div class="root"> et le style de ce div :

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

Voir ce plunker

10
répondu alexpods 2015-09-30 17:36:49

dans votre composant vous pouvez ajouter .classe à votre hôte si vous auriez quelques styles que vous souhaitez appliquer.

export class MyComponent{
     @HostBinding('class') classes = 'classA classB';
8
répondu Xquick 2017-05-27 01:02:07

pour tous ceux qui cherchent à styliser les éléments enfants d'un :host voici un exemple d'utilisation de ::ng-deep

:host::ng-deep <child element>

E. g :host::ng-deep span { color: red; }

comme d'autres ont dit /deep/ est déprécié

4
répondu Petros Kyriakou 2017-09-24 11:56:13

Essayez le :host > /deep/ :

ajouter ce qui suit au parent.composant.moins file

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

remplacer l'application-child-component par votre sélecteur d'enfant

3
répondu abahet 2017-09-04 14:02:00