如何在 [ngClass] 中混合条件和串联

How to mix conditions and concatenation in [ngClass]

我有一个 div 需要在 mouseenter 上设置 blurred/reduced 不透明度。

我创建了 2 个 css class,名为 .blur.less-opacity

Component.css

.blur {
    -webkit-filter: blur(10px);
    -moz-filter: blur(10px);
    -o-filter: blur(10px);
    -ms-filter: blur(10px);
    filter: blur(10px);
}

.less-opacity {
    opacity: 0.5;
}

我在 TS 中有变量可以从模糊切换到非模糊。还有 Input() 个变量,其中之一是 FontAwesome 图标的名称。

Component.ts

...

  @Input() iconName: string; //Contains for example 'bed'
  @Input() subTitle: string;
  @Input() info: string;
  private isVisible: boolean = true;
  private isBlurred: boolean = false;

...

  switchVisible() {
    this.isVisible = !this.isVisible;
    this.isBlurred = !this.isBlurred;
  }


我不知道如何正确编码 [ngClass] 以同时满足 .blur.less-opacity 的条件,同时连接 FontAwesome 图标名称。

Component.html

<div class="vignette d-flex flex-column justify-content-center align-items-center" (mouseenter)="switchVisible()" (mouseleave)="switchVisible()">
    <i [ngClass]="{ 'blur' : isBlurred, 'less-opacity' : !isVisible, 'fa-' + iconName : true }" class="vignette-icon fal fa-3x"></i>
    <p [ngClass]="{ 'blur' : isBlurred, 'less-opacity' : !isVisible}" class="vignette-subtitle px-3">{{ subTitle }}</p>
    <p class="vignette-info px-3"></p>
</div>

如你所见,我尝试了以下方法 [ngClass]="{'my-class': expression, 'my-class2': expression }"

我没有出现控制台错误,但图标 class 设置不正确,导致出现错误图标。

这是触发 mouseenter 事件后的结果

.blur.less-opacity class 已正确添加到 <p>,但 <i> 未正确设置。

我的问题是:我应该如何编码 [ngClass] <i> 需要在 class 名称中连接 ?

您可以使用 setter 将 'fa-' 手动添加到 @Input()

例如: 在 Component.ts

中添加一个新变量
_iconName: string;
@Input()
set iconName(iconName: string) {
  this._iconName= 'fa-' + iconName;
}

然后在 Component.html 中使用 _iconName 变量而不是 iconName

为了实现这一点,我必须找到一种解决方法,只要我找不到任何方法使其仅使用一个 [ngClass] 即可正常工作。

我已将 <i> 包裹在 span 中,并将 .blurred.less-opacity 应用于 span。此外,我为 <i> 标签设置了一个简单的 [ngClass],并根据需要设置了 iconName

Component.html

...
<span class="vignette-icon" [ngClass]="{ 'blur' : isBlurred, 'less-opacity' : !isVisible }">
 <i [ngClass]="'fa-3x fal ' + iconName"></i>
</span>
...

Component.ts

...
@Input() iconName: string;

...

ngOnInit() {
 this.setIconName(this.iconName);
}

...

setIconName(iconName: string) {
 if(!iconName.includes('fa-')) {
   this.iconName = 'fa-' + iconName;
 }
}

...

这样很好用!