Angular 2+ 在指令中追加 class

Angular 2+ append class in directive

我有 Angular 6.0.0 应用程序。需要将 class 动态附加到 html 元素。理想情况下,这应该通过指令实现。 目前我有这样的东西,它工作正常。

<div class="class1 prefix-{{variable}}"></div>

我想让前缀可重用,我正在尝试通过使用指令来达到更好的结果:

html:

<div class="class1" [appendBusinessLogicClass]="variable"></div>

appendBusinessLogicClass.directive.ts:

export class AppendBusinessLogicClass {
readonly prefix = 'prefix';
  @HostBinding('class') class = ''; // this clears the html class1
  @Input('appendBusinessLogicClass') set appendBusinessLogicClass(variable: string) {
      this.class = this.prefix + '-' + variable;
   }
}

但是 html 代码中的 HostBinding 清除 class1。但我想将 'prefix-rand' 附加到 class 列表。 请注意,我们在编译时不知道 variable

谢谢

你现在实际做的是绑定到 class 属性,所以基本上值将是 setthis.class,这完全没问题。但是,事实证明您实际上并没有从 'class' 属性获取初始值,这意味着无论您在模板上设置 class 什么,该值总是会被​​覆盖。所以基本上 Angular 接管 class 属性的设置。

因此,您需要做的是在 class 属性中获取该值的引用。在 Angular 中,您实际上可以将任何 html 属性视为 component/directive 的输入,您唯一需要做的就是用 @Input 装饰器对其进行注释。这里我们将 class 属性的值保存到 defaultClassList,然后使用它来计算新的 class 属性值,因此您的代码可能如下所示:

export class AppendBusinessLogicClass {
    readonly prefix = 'prefix';

    @Input('class')
    defaultClassList;// `class` is a keyword so we're calling it defaultClassList instead

    @HostBinding('class')
    classList;// `class` is a keyword so we're calling it classList instead

    @Input('appendBusinessLogicClass') set appendBusinessLogicClass(variable: string) {
        this.classList = this.defaultClassList + " " + this.prefix + '-' + variable;
    }
}

总而言之,只要设置了传递给指令的值,您最终就会获得模板中定义的属性值并将其包含在绑定 this.classList 中。