Angular:仅在按钮上切换活动类当前单击的按钮(不使用*ngFor)

Jon*_*han 4 javascript conditional class angular

我试图找出如何仅在单击的按钮active上切换类:

这是我目前的代码......

<div class="btn-group">
  <button class="btn btn-secondary" [ngClass]="{ 'active' : isActive }" (click)="isActive = !isActive" type="button">Premier bouton</button>
  <button class="btn btn-secondary" [ngClass]="{ 'active' : isActive }" (click)="isActive = !isActive" type="button">Second bouton</button>
  <button class="btn btn-secondary" [ngClass]="{ 'active' : isActive }" (click)="isActive = !isActive" type="button">Troisième bouton</button>
  <button class="btn btn-secondary" [ngClass]="{ 'active' : isActive }" (click)="isActive = !isActive" type="button">Quatrième bouton</button>
</div>
Run Code Online (Sandbox Code Playgroud)

......这就是结果:

在此输入图像描述

不使用 *ngForng-repeat原则.我知道我需要隔离每个按钮.我怎样才能做到这一点?

添加this.isActive不行:this.isActive.

Nil*_*ner 7

我只会为每个按钮使用一个唯一的字符串。例如:

<div class="btn-group">
  <button class="btn btn-secondary" [class.active]="isActive('btn1')" (click)="setActive('btn1')" type="button">Premier bouton</button>
  <button class="btn btn-secondary" [class.active]="isActive('btn2')" (click)="setActive('btn2')" type="button">Second bouton</button>
  <button class="btn btn-secondary" [class.active]="isActive('btn3')" (click)="setActive('btn3')" type="button">Troisième bouton</button>
  <button class="btn btn-secondary" [class.active]="isActive('btn4')" (click)="setActive('btn4')" type="button">Quatrième bouton</button>
</div>
Run Code Online (Sandbox Code Playgroud)

您的setActiveIsactive函数看起来像这样:

this.setActive = function (buttonName){
  this.activeButton = buttonName;
}
this.isActive = function (buttonName){
  return this.activeButton === buttonName;
}
Run Code Online (Sandbox Code Playgroud)

所以每个按钮都会传递它的名字,它只是一些唯一的字符串。该字符串将被保存为变量,并将用于确定是否应应用活动类。

您还会注意到您可以通过绑定到类名来切换单个类。就像我上面为活动类所做的那样,它可以与 [class.active] 绑定。


Mar*_*n07 7

简单,只需使用事件委派.

Component.html:

<div class="btn-group" (click)="onButtonGroupClick($event)">
  <button class="btn btn-secondary" type="button">Premier bouton</button>
  <button class="btn btn-secondary" type="button">Second bouton</button>
  <button class="btn btn-secondary" type="button">Troisième bouton</button>
  <button class="btn btn-secondary" type="button">Quatrième bouton</button>
</div>
Run Code Online (Sandbox Code Playgroud)

Component.ts/.js:

  onButtonGroupClick($event){
    let clickedElement = $event.target || $event.srcElement;

    if( clickedElement.nodeName === "BUTTON" ) {

      let isCertainButtonAlreadyActive = clickedElement.parentElement.querySelector(".active");
      // if a Button already has Class: .active
      if( isCertainButtonAlreadyActive ) {
        isCertainButtonAlreadyActive.classList.remove("active");
      }

      clickedElement.className += " active";
    }

  }
Run Code Online (Sandbox Code Playgroud)

实例:https://plnkr.co/edit/EE4dOMgpY8QA2qZXjMiW?p = preview

  • 我接受这个答案,这是解决我的问题最准确的答案,即使我希望看到一种更简单的“角度方式”,在未来在框架中实现。谢谢。 (2认同)