Angular 2 如何仅在有变化或发生某些事情时添加class
Angular 2 How to add a class only when there are changes or something happens
我注意到如果我们根据函数声明 [ngClass],应用程序会不断调用该函数。或者,如果我们绑定到一个布尔变量,如果没有任何反应,它也会检查该值。
我想知道是否有一种方法可以实现与 ngClass 相同的效果,但仅在 "something happens" 时才调用函数或检查布尔值。当按下一个按钮,或按下任意按钮时。
我不知道解决方案是否可以使用 ngChange 但我没有看到更改 class 的方法,然后没有直接参考控制器中的 DOM 元素我正在尝试闪避.
你完全正确。 ngOnChanges()
任何 @Input() 属性更改时都会触发生命周期挂钩。
例如,
在你的主要组件中
<app-child-component [childData]="childData"> Some Text </app-child-component>
this.service.getData().subscribe((data)=>{
this.childData = data;
});
childData 值改变的那一刻
ngOnChanges(changes: SimpleChanges){
if(this.childData){
//when value is present
this.assignSomeClass();
}
}
assignSomeClass(){
///your code for ngClass
}
注意:ChildComponent 必须有 @Input() childData:any[]
使用 :host(..) 和@HostBinding
假设您有一个组件,您希望根据某些设置应用不同的 CSS classes,例如在您指定时使用 .yellow-style,在指定时使用 .red-style你传递红色:.
这里需要注意的重要一点是,与我们目前所做的不同,我们不希望 CSS class 应用于组件内部的某些元素,但是到组件本身。示例:
<styled style="red" _nghost-c0="" ng-reflect-style="red" class="red-
style">
<div _ngcontent-c0="">
I'm a div that wants to be styled
</div>
</styled>
不过,出于可重用性的目的,我们的样式应该由组件本身提供,因此我们再次使用 StyledComponent 的样式 属性:
@Component({
selector: 'styled',
template: `
<div>
I'm a div that wants to be styled
</div>
`,
styles: [
`
:host(.yellow-style) {
background-color: yellow;
border: 1px solid black;
display:block;
}
:host(.red-style) {
background-color: red;
border: 1px solid black;
color: white;
display:block;
}
`
]
})
export class StyledComponent { }
如您所见,我们使用特殊的 :host(...) 选择器来定位托管组件的元素上的样式。关于此的官方文档的更多信息。通过这种方式,.yellow-style 和 .red-style 将在主机组件级别可见,同时它们将被封装并且仅适用于我们 StyledComponent 中的元素。
接下来,我们定义一个@Input() 属性 允许我们传入样式配置。
@Component({...})
export class StyledComponent {
@Input() style;
}
我们仍然缺少的是根据样式输入 属性 的值以编程方式在我们的宿主元素上设置 CSS class。我们为此使用@HostBinding:
import { Component, Input, HostBinding } from '@angular/core';
@Component({ ... })
export class StyledComponent {
@Input() style;
@HostBinding('class.yellow-style') yellowStyle:boolean = false;
@HostBinding('class.red-style') redStyle:boolean = false;
ngOnChanges(changes) {
let newStyle = changes.style.currentValue;
if(newStyle === 'yellow') {
this.yellowStyle = true;
this.redStyle = false;
} else if(newStyle === 'red') {
this.yellowStyle = false;
this.redStyle = true;
} else {
// nothing here.. (fallback?)
}
}
}
在 ngOnChanges 中,我们输入的样式 属性 发生了变化,我们适当地调整了我们的样式标志。 (请注意,这不是最智能的代码,但它足够简单,所以你明白了:wink:)。
文本来自:https://juristr.com/blog/2016/01/learning-ng2-dynamic-styles/
所有优点都在那里。收集传播。您还有一个示例可以在网站上播放。
我注意到如果我们根据函数声明 [ngClass],应用程序会不断调用该函数。或者,如果我们绑定到一个布尔变量,如果没有任何反应,它也会检查该值。
我想知道是否有一种方法可以实现与 ngClass 相同的效果,但仅在 "something happens" 时才调用函数或检查布尔值。当按下一个按钮,或按下任意按钮时。
我不知道解决方案是否可以使用 ngChange 但我没有看到更改 class 的方法,然后没有直接参考控制器中的 DOM 元素我正在尝试闪避.
你完全正确。 ngOnChanges()
任何 @Input() 属性更改时都会触发生命周期挂钩。
例如,
在你的主要组件中
<app-child-component [childData]="childData"> Some Text </app-child-component>
this.service.getData().subscribe((data)=>{
this.childData = data;
});
childData 值改变的那一刻
ngOnChanges(changes: SimpleChanges){
if(this.childData){
//when value is present
this.assignSomeClass();
}
}
assignSomeClass(){
///your code for ngClass
}
注意:ChildComponent 必须有 @Input() childData:any[]
使用 :host(..) 和@HostBinding
假设您有一个组件,您希望根据某些设置应用不同的 CSS classes,例如在您指定时使用 .yellow-style,在指定时使用 .red-style你传递红色:.
这里需要注意的重要一点是,与我们目前所做的不同,我们不希望 CSS class 应用于组件内部的某些元素,但是到组件本身。示例:
<styled style="red" _nghost-c0="" ng-reflect-style="red" class="red-
style">
<div _ngcontent-c0="">
I'm a div that wants to be styled
</div>
</styled>
不过,出于可重用性的目的,我们的样式应该由组件本身提供,因此我们再次使用 StyledComponent 的样式 属性:
@Component({
selector: 'styled',
template: `
<div>
I'm a div that wants to be styled
</div>
`,
styles: [
`
:host(.yellow-style) {
background-color: yellow;
border: 1px solid black;
display:block;
}
:host(.red-style) {
background-color: red;
border: 1px solid black;
color: white;
display:block;
}
`
]
})
export class StyledComponent { }
如您所见,我们使用特殊的 :host(...) 选择器来定位托管组件的元素上的样式。关于此的官方文档的更多信息。通过这种方式,.yellow-style 和 .red-style 将在主机组件级别可见,同时它们将被封装并且仅适用于我们 StyledComponent 中的元素。
接下来,我们定义一个@Input() 属性 允许我们传入样式配置。
@Component({...})
export class StyledComponent {
@Input() style;
}
我们仍然缺少的是根据样式输入 属性 的值以编程方式在我们的宿主元素上设置 CSS class。我们为此使用@HostBinding:
import { Component, Input, HostBinding } from '@angular/core';
@Component({ ... })
export class StyledComponent {
@Input() style;
@HostBinding('class.yellow-style') yellowStyle:boolean = false;
@HostBinding('class.red-style') redStyle:boolean = false;
ngOnChanges(changes) {
let newStyle = changes.style.currentValue;
if(newStyle === 'yellow') {
this.yellowStyle = true;
this.redStyle = false;
} else if(newStyle === 'red') {
this.yellowStyle = false;
this.redStyle = true;
} else {
// nothing here.. (fallback?)
}
}
}
在 ngOnChanges 中,我们输入的样式 属性 发生了变化,我们适当地调整了我们的样式标志。 (请注意,这不是最智能的代码,但它足够简单,所以你明白了:wink:)。
文本来自:https://juristr.com/blog/2016/01/learning-ng2-dynamic-styles/ 所有优点都在那里。收集传播。您还有一个示例可以在网站上播放。