我不知道如何在组件的模板html(component.html)中添加动态class属性到<component></component>
标签中。
我找到的唯一解决方案是通过“ElementRef”本机元素修改项目。但这个解决方案似乎有些复杂,做起来应该很简单。
另一个问题是CSS必须在组件范围之外定义,打破了组件封装性。
是否有更简单的解决方案?像<root [class]="..."> .... </ root>
这样在模板中。
我不知道如何在组件的模板html(component.html)中添加动态class属性到<component></component>
标签中。
我找到的唯一解决方案是通过“ElementRef”本机元素修改项目。但这个解决方案似乎有些复杂,做起来应该很简单。
另一个问题是CSS必须在组件范围之外定义,打破了组件封装性。
是否有更简单的解决方案?像<root [class]="..."> .... </ root>
这样在模板中。
这样您就不需要在组件外部添加CSS:
@Component({
selector: 'body',
template: 'app-element',
// prefer decorators (see below)
// host: {'[class.someClass]':'someField'}
})
export class App implements OnInit {
constructor(private cdRef:ChangeDetectorRef) {}
someField: boolean = false;
// alternatively also the host parameter in the @Component()` decorator can be used
@HostBinding('class.someClass') someField: boolean = false;
ngOnInit() {
this.someField = true; // set class `someClass` on `<body>`
//this.cdRef.detectChanges();
}
}
这个CSS是在组件内定义的,选择器只在主机元素(来自外部)上设置了类someClass
时才应用:
:host(.someClass) {
background-color: red;
}
Günter的回答非常好(问题要求使用动态类属性),但为了完整起见,我想补充一下...
如果您正在寻找一种快速而简洁的方法来向组件的主机元素添加一个或多个静态类(即用于主题样式的目的),可以这样做:
@Component({
selector: 'my-component',
template: 'app-element',
host: {'class': 'someClass1'}
})
export class App implements OnInit {
...
}
如果你在入口标签上使用一个类,Angular将合并这些类,即
<my-component class="someClass2">
I have both someClass1 & someClass2 applied to me
</my-component>
ngcontent_host
,因此如果我在组件的 styleUrls
中放置样式,它们不会影响宿主元素,因为它们不会影响 ngcontent_host
,它们只能影响模板元素;它们只能影响 ngcontent_template
。我错了吗?对此有什么建议吗?我想我可以随时将 ViewEncapsulation.None
打开。 - Nate Anderson@HostBinding('class.someClass') true;
。你甚至可以在任何你的组件继承的类中这样做。 - adamdport{}
变量,您可能希望在tslint.json
中将use-host-property-decorator
设置为false
。否则,您将收到IDE警告。@adamdport那种方法不起作用(不再起作用)。我们的应用程序中使用Angular 5.2.2。 - Ruud Voost您可以在@Component类中简单地添加 @HostBinding('class') class = 'someClass';
。
例如:
@Component({
selector: 'body',
template: 'app-element'
})
export class App implements OnInit {
@HostBinding('class') class = 'someClass';
constructor() {}
ngOnInit() {}
}
class
作为变量名(因为您可能会引用它并稍后更改它)。例如:@HostBinding('className') myTheme = 'theme-dark';
。 - CPHPythonHostBinding
与getter结合使用。@HostBinding('class') get class() {
return aComponentVariable
}
请参考https://stackblitz.com/edit/angular-dynamic-hostbinding中的Stackblitz演示。
另一个问题是CSS必须在组件范围之外定义,破坏了组件的封装性。
这不是真的。通过使用 scss (SASS) 你可以轻松地为组件本身(即host元素)添加样式,如下所示:
:host {
display: block;
position: absolute;
width: 100%;
height: 100%;
pointer-events: none;
visibility: hidden;
&.someClass {
visibility: visible;
}
}
这样封装就是“完整的”。
对于多个类的情况,就像 @jbojcic 上面提到的那样,您可以使用:
host: {class: 'A B C'}
除了@JoshuaDavid的回答外,还有另一种定义静态类的方法,我在尝试时发现它适用于angularv8(可能也适用于旧版本):
@Component({
selector: "my-component.someClass1.someClass2",
...
})
<my-component class="someClass1 someClass2">
...
</my-component>
@Component({
selector: ".someClass1.someClass2",
...
})
这将生成以下输出:
<div class="someClass1 someClass2">
...
</div>
selector: "my-component.someClass1.someClass2",
,那么我在 HTML 中使用的选择器就必须是 <my-component.someClass1.someClass2>... - TonyHostBinding
getter 的方法最方便:@Component({ ... })
export class MyComponent {
@Input()
theme: 'success' | 'error';
@HostBinding('class')
get classes(): Record<string, boolean> {
return {
'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> {
return {
'my-component': true,
'my-component-modifier': true
}
}
}
这是我所做的:
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
) { }
}
没有看到任何关于Renderer2方法的答案
这是我使用的例子:
constructor(
private readonly elementRef: ElementRef,
private readonly renderer: Renderer2
) { }
@Input()
set disabled(disabled: boolean) {
if (disabled) {
this.renderer.addClass(this.elementRef.nativeElement, 'disabled');
}
}
ngOnInit
内部ngOnInit(): void {
if (this.something.disabled) {
this.renderer.addClass(this.elementRef.nativeElement, 'disabled');
}
}
:host
部分工作原理。我在哪里可以学习更多关于 @Component() 装饰器中 host 参数的知识(语法对我来说不是很明显,而且 @Component 文档并没有解释得很清楚),或者学习更多关于您首选的 HostBinding 的知识(它只被列为一个接口 listed as an Interface 在 Angular2 网站上?) - Nate Anderson@Input()
@Output()
@HostBinding()
@HostListener()
@ViewChild(ren)()
@ContentChild(ren)()
所实现的功能。 - Günter Zöchbauer@HostBinding('class.xxx') get xxxclass(){ return !this.someField;}
。 - Günter Zöchbauer