我不知道如何添加到我的组件<component></component>一个动态类属性,但在模板html (component.html)。

我找到的唯一解决方案是通过“ElementRef”原生元素修改项目。这个解决方案似乎有点复杂,做一些应该很简单的事情。

另一个问题是CSS必须在组件作用域之外定义,这破坏了组件封装。

有没有更简单的解决办法?比如<root [class]="…"" >…模板中的</ root>。


当前回答

Günter的答案是伟大的(问题是要求动态类属性),但我认为我将添加只是为了完整性…

如果你正在寻找一种快速干净的方法来添加一个或多个静态类到你的组件的主机元素(即,为了主题样式的目的),你可以这样做:

@Component({
   selector: 'my-component',
   template: 'app-element',
   host: {'class': 'someClass1'}
})
export class App implements OnInit {
...
}

如果你在entry标签上使用了一个类,Angular会合并这些类,例如,

<my-component class="someClass2">
  I have both someClass1 & someClass2 applied to me
</my-component>

其他回答

Günter的答案是伟大的(问题是要求动态类属性),但我认为我将添加只是为了完整性…

如果你正在寻找一种快速干净的方法来添加一个或多个静态类到你的组件的主机元素(即,为了主题样式的目的),你可以这样做:

@Component({
   selector: 'my-component',
   template: 'app-element',
   host: {'class': 'someClass1'}
})
export class App implements OnInit {
...
}

如果你在entry标签上使用了一个类,Angular会合并这些类,例如,

<my-component class="someClass2">
  I have both someClass1 & someClass2 applied to me
</my-component>

如果你想给你的host元素添加一个动态类,你可以把你的HostBinding和getter结合起来

@HostBinding('class') get class() {
    return aComponentVariable
}

Stackblitz演示在https://stackblitz.com/edit/angular-dynamic-hostbinding

这就是我所做的:

import { Component, Attribute, HostBinding } from "@angular/core";

@Component({
    selector: "selector-el",
    template: ...                                            
})
export class MyComponent {
    @HostBinding('class') get classAttribute(): string {
        let defaultClasses = 'selector-el-class';
        return defaultClasses + ' ' + this.classNames;
    }

    constructor(
        @Attribute('class') public classNames: string
    ) { }
}

你可以简单地添加@HostBinding('class') class = 'someClass';在@Component类中。

例子:

@Component({
   selector: 'body',
   template: 'app-element'       
})
export class App implements OnInit {

  @HostBinding('class') class = 'someClass';

  constructor() {}      

  ngOnInit() {}
}

当你有多个主机绑定类时,我发现下面使用HostBinding getter是最方便的:

@Component({ ... })
export class MyComponent {
    @Input()
    theme: 'success' | 'error';

    @HostBinding('class')
    get classes(): Record<string, boolean> {
        'my-component': true,
        'my-component-success-theme': this.theme == 'success',
        'my-component-error-theme': this.theme == 'error' 
    }
}

即使对于没有相应逻辑的普通类绑定,这也是在一个地方管理所有宿主类的好方法。

@Component({ ... })
export class MyComponent {
    @HostBinding('class')
    get classes(): Record<string, boolean> {
        'my-component': true,
        'my-component-modifier': true
    }
}

此外,与@Component装饰器的host属性不同,这种方法还允许您为类字符串使用枚举。

export enum MyComponentClass {
    BaseClass = 'my-component',
    ModifierClass = 'my-component-modifier'
}

@Component({ ... })
export class MyComponent {
    @HostBinding('class')
    get classes(): Record<string, boolean> {
        [MyComponentClass.BaseClass]: true,
        [MyComponentClass.ModifierClass]: true
    }
}