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.

Nir Schwartz
fuente
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í

Pankaj Parkar
fuente
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>
Del mes próximo
fuente
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="">

Flojo
fuente
3

Puede estar debajo del código que puede ayudar:

<button [attr.disabled]="!isValid ? true : null">Submit</button>
Shivang Gupta
fuente
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>
pritesh agrawal
fuente
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()

Sergey P. también conocido como azul
fuente
2

Creo que esta es la forma mas facil

<!-- Submit Button-->
<button 
  mat-raised-button       
  color="primary"
  [disabled]="!f.valid"
>
  Submit
</button>
Gouk
fuente
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;
}
Amir Touitou
fuente