Angular 2如何仅在发生更改或事件时添加类

Angular 2如何仅在发生更改或事件时添加类,angular,ng-class,angularjs-ng-change,Angular,Ng Class,Angularjs Ng Change,我注意到,如果我们根据一个函数声明一个[ngClass],应用程序会连续调用该函数。或者,如果我们绑定到一个布尔变量,如果没有发生任何事情,它也会检查该值 我想知道是否有一种方法可以产生与ngClass相同的效果,但只在“发生了什么”时调用函数或检查布尔值。当按下按钮或按下任何按钮时 我不知道解决方案是否可以使用ngChange,但如果不直接参考控制器中的DOM元素,我看不到改变类的方法。我试图回避的是什么。你完全正确ngOnChanges()生命周期挂钩 比如说, 在您的主要组件中 <a

我注意到,如果我们根据一个函数声明一个[ngClass],应用程序会连续调用该函数。或者,如果我们绑定到一个布尔变量,如果没有发生任何事情,它也会检查该值

我想知道是否有一种方法可以产生与ngClass相同的效果,但只在“发生了什么”时调用函数或检查布尔值。当按下按钮或按下任何按钮时


我不知道解决方案是否可以使用ngChange,但如果不直接参考控制器中的DOM元素,我看不到改变类的方法。我试图回避的是什么。

你完全正确<当任何@Input()属性发生更改时,都会触发代码>ngOnChanges()生命周期挂钩

比如说,

在您的主要组件中

<app-child-component [childData]="childData"> Some Text </app-child-component>

 this.service.getData().subscribe((data)=>{
    this.childData = data;
});

注意:ChildComponent必须具有
@Input()childData:any[]

您完全正确<当任何@Input()属性发生更改时,都会触发代码>ngOnChanges()生命周期挂钩

比如说,

在您的主要组件中

<app-child-component [childData]="childData"> Some Text </app-child-component>

 this.service.getData().subscribe((data)=>{
    this.childData = data;
});
注意:ChildComponent必须具有
@Input()childData:any[]

使用:host(..)和@HostBinding

假设您有一个组件,您希望根据某些设置应用不同的CSS类,例如指定时为.yellow样式,传递时为.red样式:

这里需要注意的是,与我们目前所做的不同,我们不希望CSS类应用于组件内部的某些元素,而是应用于组件本身。例如:

<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>
我们仍然缺少的是基于style输入属性的值以编程方式在宿主元素上设置CSS类。我们使用@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:)

文本来自: 所有的优点都在那里。收集起来传播。您还可以在网站上玩一个示例。

使用:host(..)和@HostBinding

假设您有一个组件,您希望根据某些设置应用不同的CSS类,例如指定时为.yellow样式,传递时为.red样式:

这里需要注意的是,与我们目前所做的不同,我们不希望CSS类应用于组件内部的某些元素,而是应用于组件本身。例如:

<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>
我们仍然缺少的是基于style输入属性的值以编程方式在宿主元素上设置CSS类。我们使用@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:)

文本来自:
所有的优点都在那里。收集起来传播。你也可以在网站上玩一个例子。

非常感谢,很有用。用了2天?你是什么意思?非常感谢,很有用。用了两天?你什么意思?