Je ne sais pas comment ajouter à mon composant <component></component>
un attribut de classe dynamique mais à l'intérieur du template html (component.html).
La seule solution que j'ai trouvée est de modifier l'élément via l'élément natif "ElementRef". Cette solution semble un peu compliquée pour faire quelque chose qui devrait être très simple.
Un autre problème est que CSS doit être défini en dehors de la portée des composants, ce qui rompt l'encapsulation des composants.
Existe-t-il une solution plus simple? Quelque chose comme <root [class]="..."> .... </ root>
à l'intérieur du modèle.
la source
someField = true
inngOnInit()
-met au lieu dengAfterViewInit()
. Je ne pourrais pas le faire fonctionner autrement.:host
pièce. Où puis-je en savoir plus sur les paramètres d'hôte dans le décorateur @Component () (la syntaxe n'est pas évidente pour moi, et la documentation @Component n'explique pas grand-chose ) ou en savoir plus sur votre HostBinding préféré (il n'est répertorié que comme interface sur Site Angular2?)@Input()
@Output()
@HostBinding()
@HostListener()
@ViewChild(ren)()
@ContentChild(ren)()
@HostBinding('class.xxx') get xxxclass(){ return !this.someField;}
La réponse de Günter est excellente (la question demande un attribut de classe dynamique ) mais j'ai pensé que j'ajouterais juste pour être complet ...
Si vous recherchez un moyen rapide et propre d'ajouter une ou plusieurs classes statiques à l'élément hôte de votre composant (c'est-à-dire à des fins de style de thème), vous pouvez simplement faire:
Et si vous utilisez une classe sur la balise d'entrée, Angular fusionnera les classes, c'est-à-dire,
la source
ngcontent_host
que n'importe lequel des attributs sur les éléments de mon modèle, let's call those
ngcontent_template, so if I put a style in the
styleUrls` de mon composant, ils n'affecteront pas l'élément hôte car ils n'affecteront pasngcontent_host
, ils ne peut affecter que les éléments du modèle; ils ne peuvent qu'affecterngcontent_template
. Est-ce que je me trompe? Des suggestions à ce sujet? Je suppose que je pourrais toujours tournerViewEncapsulation.None
@HostBinding('class.someClass') true;
. Vous pouvez même le faire à partir de n'importe quelle classe étendue par votre composant.{}
variante hôte :, vous souhaiterez peut-être définir leuse-host-property-decorator
paramètre surfalse
intslint.json
. Sinon, vous recevrez des avertissements IDE. @adamdport Cette méthode ne fonctionne pas (plus). Utilisation d'Angular 5.2.2 dans notre application.Vous pouvez simplement ajouter
@HostBinding('class') class = 'someClass';
dans votre classe @Component .Exemple:
la source
class
comme nom de variable (car vous pouvez la référencer et la modifier ultérieurement). Exemple:@HostBinding('className') myTheme = 'theme-dark';
.Si vous souhaitez ajouter une classe dynamique à votre élément hôte, vous pouvez combiner votre
HostBinding
avec un getter commeDémo Stackblitz sur https://stackblitz.com/edit/angular-dynamic-hostbinding
la source
Voici comment je l'ai fait (Angular 7):
Dans le composant, ajoutez une entrée:
Ensuite, dans le modèle HTML du composant, ajoutez quelque chose comme:
Et enfin dans le modèle HTML où vous installez le composant:
Avertissement: je suis assez nouveau dans Angular, donc je vais peut-être avoir de la chance ici!
la source
<root>
balise, pas tout ce que vous ajoutez dans le modèle de l'élément.