如果单击禁用的按钮,则通过 ngClass 添加类

Posted

技术标签:

【中文标题】如果单击禁用的按钮,则通过 ngClass 添加类【英文标题】:Add class through ngClass if a disabled button is clicked 【发布时间】:2018-09-30 01:13:14 【问题描述】:

如果单击 [disabled] 按钮,我希望能够向元素添加 scss 类(“错误”)。我如何实现这一目标? Angular2 disable button [disabled] 属性是必需的,因此这不是一个可行的解决方案。

<button [disabled]="!isTermAgreed || isLoading" (click)="payForStory(paymentObject.StoryId)">

span 元素将通过[ngClass] 接收的scss 类:

&.error 
  border: 2px solid red;

【问题讨论】:

【参考方案1】:

每当按钮被禁用时,都会默认添加一个 button:disabled 类。所以你可以把你的风格放在课堂上。如图:

button:disabled 
 background-color: #97929248;
 cursor: not-allowed;

【讨论】:

【参考方案2】:

如果您的按钮被禁用,则它不会监听(click) 事件,在这种情况下,您可以做的一件事是使用 css 使其看起来像禁用,并在单击后启用 disabled 属性。

在您的组件中:

clickedMe: boolean = false;

在您的 html 中:

<button [disabled]="(!isTermAgreed || isLoading) && clickedMe" [ngClass]="'disableCss': (!isTermAgreed || isLoading), 'error': clickedMe && (!isTermAgreed || isLoading)"(click)="payForStory(paymentObject.StoryId); clickedMe = true">

你的 css 会是这样的:

.disableCss 
    background: #dddddd

【讨论】:

这可能行得通,谢谢,我会实施并测试它。 请查看更新后的答案,当按钮启用时,我忘记删除 error 另外,如果您不想在禁用条件为真时调用payForStory(),那么您可以使用类似:(click)="!(!isTermAgreed || isLoading) ? (payForStory(...)): '' ; clickedMe = true"【参考方案3】:

在 Angular 中没有漂亮的方法可以做到这一点。 Angular 的结构方式使得您不应该手动检查 DOM,除非在极少数情况下。如果您必须这样做,请查看this link,这个接受的答案有一个可能对您有用的解决方案。

另一种方法是始终在单击时添加 .error 类,但构造您的 sass 以使 .error 的属性仅在 .disabled 也存在时才被激活。

例如:

<button (click)="isError = true" [ngClass]="error: isError">My Button</button>

然后在你的 SASS 中:

.disabled.error 
  //Your style here

【讨论】:

如何在禁用按钮的点击事件中添加.error 类? 在上面添加了一个示例。此代码不会取消按钮错误,您必须根据您的应用程序自己添加此逻辑。【参考方案4】:

在您的组件中创建一个布尔属性,即activeClass,监听按钮上的单击事件以切换它,然后只需使用 ngClass 根据布尔值分配类。

[ngClass]="'yourClass': activeClass"

编辑

正如正确指出的那样,您不能在禁用按钮上监听事件。对此的解决方案是使用div 包装元素并监听该元素上的事件(有关详细信息,请参阅this 答案)或使用类来模拟禁用效果。

【讨论】:

我想到了这个,但我的印象是,您无法在禁用按钮上监听点击事件? 谢谢,这可能会奏效——正如这里有人所说,确实没有很好的方法来做到这一点:-) 干杯【参考方案5】:

您无法侦听禁用按钮上的点击事件。您可以向按钮添加一个禁用的类,然后像往常一样监听事件。请查看此堆栈闪电战:https://stackblitz.com/edit/angular-3ksttt

组件:

import  Component  from '@angular/core';

@Component(
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
)
export class AppComponent  
  isButtonClicked: boolean = false;

  public disableButtonClick() 
    this.isButtonClicked = true;
  

模板:

<button [ngClass]="isButtonClicked ? 'error' : ''" (click)="disableButtonClick()" class="disabled">BUTTON</button>

【讨论】:

以上是关于如果单击禁用的按钮,则通过 ngClass 添加类的主要内容,如果未能解决你的问题,请参考以下文章

如果用户尝试单击禁用的单选按钮,则显示提示文本

当价格为零时,通过添加类使用 jquery 禁用“添加到购物车”按钮

Angular 2在条件下更改类

directive ngClass

复选框标签启用禁用敲除js

如何通过单击按钮禁用 JQuery 功能,但默认保持打开状态?