Botón de desactivación de Angular2


113

Sé que en angular2 puedo deshabilitar un botón con el [disable]atributo, por ejemplo:

<button [disabled]="!isValid" (click)="onConfirm()">Confirm</button>

pero ¿puedo hacerlo usando [ngClass]o [ngStyle]? Al igual que:

<button [ngStyle]="{disabled : !isValid}" (click)="onConfirm()">Confirm</button>

Gracias.


1
aquí está trabajando plnkr para el mismo plnkr.co/edit/MW3vT4XscWcKrDdAwBoE?p=preview
Pardeep Jain

Respuestas:


173

Actualizar

Me pregunto. ¿Por qué no desea utilizar el [disabled]enlace de atributo proporcionado por Angular 2? Es la forma correcta de lidiar con esta situación. Propongo que mueva su isValidcheque a través del método de componentes.

<button [disabled]="! isValid" (click)="onConfirm()">Confirm</button>

El problema con lo que intentó se explica a continuación

Básicamente, podrías usar ngClassaquí. Pero agregar clase no restringiría el disparo del evento. Para activar un evento con una entrada válida, debe cambiar el clickcódigo de evento a continuación. Entonces eso onConfirmse disparará solo cuando el campo sea válido.

<button [ngClass]="{disabled : !isValid}" (click)="isValid && onConfirm()">Confirm</button>

Demo aquí


Bueno, agrego que ngClass ya está en el botón, por lo que me parece que los discapacitados deben estar allí, ¿por qué se prefiere la forma [discapacitados]?
Nir Schwartz

@NirSchwartz porque hará ambas cosas a la vez ... las reglas del selector css se aplicarán en el button[disabled]selector basado en y el evento desactivado restringirá el clickevento para que se active en el botón ... en la ngClassclase, debe manejarlo por su cuenta, como se muestra en respuesta anterior ..
Pankaj Parkar

La razón por la que la gente quiere usar [attr.disabled] en lugar de [disabled] es porque [disabled] de angular FormControl no se puede configurar de forma dinámica. Aquí está el problema github.com/angular/angular/issues/11271
davyzhang

1
No debería llamar a un método en un enlace de plantilla. [disabled]="!isValid"
Tom

3
Ahhaa ... si el método tiene solo una referencia de variable, está bien ... Si tiene lógica compleja dentro de una función, entonces no es la preferida. Tienes razón, en este caso puedo llamar directamente a la isValidbandera en la interfaz de usuario
Pankaj Parkar

39

Recomendaría lo siguiente.

<button [disabled]="isInvalid()">Submit</button>

4
¿No es mejor evitar las llamadas a funciones en html, ya que se llamará cada tick / ciclo?
John



5

Usar ngClasspara deshabilitar el botón para un formulario no válido no es una buena práctica en Angular2 cuando proporciona funciones incorporadas para habilitar y deshabilitar el botón si el formulario es válido e inválido respectivamente sin hacer ningún esfuerzo / lógica adicional.

[disabled] hará todo, como si el formulario es válido, se habilitará y si el formulario no es válido, se deshabilitará automáticamente.

Ver ejemplo:

<form (ngSubmit)="f.form.valid" #f="ngForm" novalidate>
<input type="text" placeholder="Name" [(ngModel)]="txtName" name="txtname" #textname="ngModel" required>
<input type="button" class="mdl-button" [disabled]="!f.form.valid" (click)="onSave()" name="">


3

Puede estar debajo del código que puede ayudar:

<button [attr.disabled]="!isValid ? true : null">Submit</button>

Esta no es una buena solución ya que <button disabled="">o <button disabled="false">todavía se maneja como un botón deshabilitado en la mayoría de los navegadores
BillyTom

2

Intenté usar deshabilitado junto con el evento de clic. A continuación se muestra el fragmento, la respuesta aceptada también funcionó perfectamente bien, estoy agregando esta respuesta para dar un ejemplo de cómo se puede usar con las propiedades deshabilitadas y de clic.

<button (click)="!planNextDisabled && planNext()" [disabled]="planNextDisabled"></button>

2

Si está utilizando formularios reactivos y desea deshabilitar alguna entrada asociada con un control de formulario, debe colocar esta disabledlógica en su código y llamar yourFormControl.disable()oyourFormControl.enable()


2

Creo que esta es la forma mas facil

<!-- Submit Button-->
<button 
  mat-raised-button       
  color="primary"
  [disabled]="!f.valid"
>
  Submit
</button>

1
 <button [disabled]="this.model.IsConnected() == false"
              [ngClass]="setStyles()"
              class="action-button action-button-selected button-send"
              (click)= "this.Send()">
          SEND
        </button>

código .ts

setStyles() 
{
    let styles = {

    'action-button-disabled': this.model.IsConnected() == false  
  };
  return styles;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.