@HostBinding与angular2中的变量类

B H*_*ull 36 angular

我有这个代码在主机上设置一个类:

@HostBinding('class.fixed') true;
Run Code Online (Sandbox Code Playgroud)

我想做的是让它成为一个我可以修改的变量类.我怎样才能做到这一点?

Gün*_*uer 67

这不可变.

你可以做的是直接绑定到类属性

@HostBinding('class') classes = 'class1 class2 class3';
Run Code Online (Sandbox Code Playgroud)

  • 这有效,但问题是它会覆盖从父组件添加到主机元素的任何类 (14认同)
  • 什么是downvote?它不起作用了吗?从那以后发生了一些变化,导致绑定到`[class] ="......"的问题,这也可能会影响这种方法. (3认同)
  • @GünterZöchbauer - 我已经创建了一个问题 (https://github.com/angular/angular/issues/26251) - 将看到它是怎么回事。 (2认同)
  • @RyanSilva 这不再是 Angular 13 的问题。更改时我没有检查确切的版本。当前的行为是,直接设置到父模板中元素的类与“@HostBinding”定义合并。然而,组件中的多个`@HostBinding('class')`仍然存在冲突。 (2认同)

Mar*_*cok 30

如果您的课程数量有限,您可以有条件地添加每个课程:

@HostBinding('class.c1') get c1 () { return this.useC1; } 
@HostBinding('class.c2') get c2 () { return this.useC2; }
Run Code Online (Sandbox Code Playgroud)

请注意,.c1.c2需要在部件的外侧.

Plunker

  • 如果使用`:host`选择器,则无需在组件外部定义.c1和.c2。参见以下答案以获取示例:/sf/ask/2461807841/#46207423 (4认同)
  • 我需要添加`()`才能工作(例如`get c1(){return this.useC1;}`. (3认同)

Cri*_*ìna 14

我必须与其他答案相矛盾,我实际上发现以下格式完美无缺:

@HostBinding('class.className') variableName = true;
Run Code Online (Sandbox Code Playgroud)

您只需要在CSS类中添加一个范围(您可以在此处查看讨论).

问题是class.className只能看到主机范围,所以如果你在元数据中定义了一些样式,HostBinding你需要指定css属于主机范围.

您可以轻松指定仅Component在CSS规则之前添加的主机范围:

:host.className {
  /* Your CSS here */
}
Run Code Online (Sandbox Code Playgroud)

代替

.className {
  /* Your CSS here */
}
Run Code Online (Sandbox Code Playgroud)

如果你愿意,我创建了一个工作的Plunker,你可以看到点击这里

  • 但这是针对固定类名,而不是可变类名。 (3认同)

mat*_*wka 6

如果已经有一些类名绑定到变量,那么Günter的答案实际上并没有帮助。

变量字符串类名称与布尔样式预定义的类名称结合在一起的一种好方法是使用classnames npm软件包。

将其与@HostBinding和和setter函数一起使用可获得惊人的结果:

import * as classNames from 'classnames';

(...)

@HostBinding('class') get classes(): string {
  return classNames(this.getDynamicClassName(), {
    'is-open': this.isOpen,
    'has-children': this.hasChildren
  });
}
Run Code Online (Sandbox Code Playgroud)


小智 6

@Input()
  class = '';

@HostBinding('attr.class')
get btnClasses() {
return [
    'btn',
    this.someClassAsString,
    this.enableLight ? 'btn-secondary-light' : '',
    this.class,
].filter(Boolean).join(' ');
};
Run Code Online (Sandbox Code Playgroud)

您可以使用输入劫持类属性并在主机绑定中添加您需要的内容