javascript - 在 JavaScript 中单击类名称后更改类名称

标签 javascript html angular twitter-bootstrap

我正在使用 Angular 6 和 Bootstrap。我正在尝试使用 document.getElementsByClassName 单击后更改类名称(以更改其大小)。我使用 *ngFor 创建了我的元素。点击它们后coinDetails(coin,i)函数开始工作。

现在,单击元素后,它会增加大小(类更改为:col-lg-2 col-md-2 col-sm-12 col-xs-12 resize),并且第二次单击同一元素后,它会减小大小(类更改为:col-lg-3 col-md-3 col-sm-12 col-xs-12 resize),如我所愿.

但是当我单击一个元素然后单击另一个元素(index 更改)时,第一个元素保持增加状态。

我不知道,如何检测变量index是否改变。

也许屏幕截图可以更好地解释它。 在这种情况下,我在开始时单击了“LTC”框,然后单击了“STRAT”框。 “STRAT”增加了尺寸,但“LTC”也保持扩大,尽管它不再是活跃的。 我希望这个“LTC”框在停止事件后与“ZEC”或“BTE”大小相同。

    coinDetails(coin, index) {
    if (this.detailToggle[index]) {
      this.detailToggle[index] = false;
      this.col = document.getElementsByClassName("resize")[index];
      this.col.className = "col-lg-2 col-md-2 col-sm-12 col-xs-12 resize";

    } else {

      this.col = document.getElementsByClassName("resize")[index];
      this.col.className = "col-lg-3 col-md-3 col-sm-12 col-xs-12 resize";

      this.detailToggle.fill(false);
      this._data.getCoin(coin).subscribe(res => {
        this.details = res["DISPLAY"][coin]["USD"];
        this.detailToggle[index] = true;
        this._data.getChart(coin).subscribe(res => {
          let coinHistory = res["Data"].map(a => a.close);

          setTimeout(() => {
            this.chart[index] = new Chart("canvas" + index, {
              type: "line",
              data: {
                labels: coinHistory,
                datasets: [
                  {
                    data: coinHistory,
                    borderColor: "#3cba9f",
                    fill: false
                  }
                ]
              },
              options: {
                tooltips: {
                  callbacks: {
                    label: function(tooltipItems, data) {
                      return "$" + tooltipItems.yLabel.toString();
                    }
                  }
                },
                responsive: true,
                legend: {
                  display: false
                },
                scales: {
                  xAxes: [
                    {
                      display: false
                    }
                  ],
                  yAxes: [
                    {
                      display: false
                    }
                  ]
                }
              }
            });
          }, 250);
        });
      });
    }
  }

最佳答案

尽量避免在 Angular 上使用 DOM 操作,而是使用 ngClass ( https://angular.io/api/common/NgClass ),在你的 html 中你应该有这样的东西:

<div *ngFor="let coin of coins">
 <div [ngClass]="coinStyle(coin.coinStatus)" (click)="coinDetails(coin, index) || coin.coinStatus=!coin.coinStatus">
 </div>
</div>

在组件上,类似这样:

coinStyle(status): string {
   if (status) {
     return 'col-lg-2 col-md-2 col-sm-12 col-xs-12 resize';
   } else {
     return 'col-lg-3 col-md-3 col-sm-12 col-xs-12 resize';
   }
}

并删除 coinDetails 函数上的 DOM 操作。

 this.col = document.getElementsByClassName("resize")[index];
 this.col.className = "col-lg-3 col-md-3 col-sm-12 col-xs-12 resize";
 this.col = document.getElementsByClassName("resize")[index];
 this.col.className = "col-lg-3 col-md-3 col-sm-12 col-xs-12 resize";

(那 4 行)。

P.s抱歉,但由于您没有分享您的 HTML,我无法为您提供更好的指南。

关于javascript - 在 JavaScript 中单击类名称后更改类名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50743076/

相关文章:

javascript - 如果验证失败需要清除输入文本

css - 样式禁用 ionic 选择

Angular 13 ngbdatepicker 不显示月份和年份的下拉列表

javascript - 浏览器的 'Back' 按钮转到倒数第二页。为什么?

javascript - Web应用架构: Implementing MVC in the browser using a server as a repository of data and templates

javascript - 如何使用 swfObject 和 Spark 嵌入宽度和高度为 100% 的 swf?

html - :first-child selecting all elements

html - 印度泰米尔字体跨浏览器字体大小问题

jquery - 多个下拉切换

angular - 为什么他们在这个 Angular 教程中循环路由参数?