Bouton de désactivation Angular2

113

Je sais que dans angular2 je peux désactiver un bouton avec l' [disable]attribut, par exemple:

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

mais puis-je le faire en utilisant [ngClass]ou [ngStyle]? Ainsi:

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

Merci.

Nir Schwartz
la source
1
ici fonctionne plnkr pour le même plnkr.co/edit/MW3vT4XscWcKrDdAwBoE?p=preview
Pardeep Jain

Réponses:

173

Mettre à jour

Je me demande. Pourquoi ne souhaitez-vous pas utiliser la [disabled]liaison d'attribut fournie par Angular 2? C'est la bonne façon de gérer cette situation. Je vous propose de déplacer votre isValidchèque via la méthode des composants.

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

Le problème avec ce que vous avez essayé expliqué ci-dessous

En gros, vous pouvez utiliser ngClassici. Mais l'ajout d'une classe n'empêcherait pas l'événement de se déclencher. Pour déclencher un événement sur une entrée valide, vous devez modifier le clickcode d'événement ci-dessous. Donc, cela onConfirmne sera déclenché que lorsque le champ est valide.

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

Démo ici

Pankaj Parkar
la source
Eh bien, j'ajoute que ngClass est déjà dans le bouton, donc il me semble que désactivé doivent être là, pourquoi la méthode [désactivée] est préférable?
Nir Schwartz
@NirSchwartz parce qu'il fera les deux choses à la fois .. les règles css du sélecteur seront appliquées sur l' button[disabled]événement basé sur le sélecteur et désactivé limiteront l' clickévénement à se déclencher sur le bouton .. dans la ngClassclasse, vous devez le gérer vous-même, comme je l'ai montré dans réponse ci-dessus ..
Pankaj Parkar
La raison pour laquelle les gens veulent utiliser [attr.disabled] plutôt que [disabled] est que [désactivé] angulaire de FormControl ne peut pas être défini dynamiquement. Voici le numéro github.com/angular/angular/issues/11271
davyzhang
1
Vous ne devez pas appeler une méthode dans une liaison de modèle. [disabled]="!isValid"
Tom
3
Ahhaa .. si la méthode a juste une référence de variable, theb c'est très bien .. Si vous avez une logique complexe à l'intérieur d'une fonction, alors ce n'est pas préféré. Vous avez raison, dans ce cas, je peux directement appeler le isValiddrapeau sur l'interface utilisateur
Pankaj Parkar
39

Je recommanderais ce qui suit.

<button [disabled]="isInvalid()">Submit</button>
Proximo
la source
4
N'est-il pas préférable d'éviter les appels de fonction en html, car il sera appelé à chaque tick / cycle?
John
5

Utiliser ngClasspour désactiver le bouton pour le formulaire invalide n'est pas une bonne pratique dans Angular2 lorsqu'il fournit des fonctionnalités intégrées pour activer et désactiver le bouton si le formulaire est respectivement valide et invalide sans faire aucun effort / logique supplémentaire.

[disabled] fera tout comme si le formulaire est valide, il sera activé et si le formulaire n'est pas valide, il sera automatiquement désactivé.

Voir l'exemple:

<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="">

Mou
la source
3

Peut-être que le code ci-dessous peut vous aider:

<button [attr.disabled]="!isValid ? true : null">Submit</button>
Shivang Gupta
la source
Ce n'est pas une bonne solution car <button disabled="">ou <button disabled="false">est toujours géré comme un bouton désactivé dans la plupart des navigateurs
BillyTom
2

J'ai essayé d'utiliser désactivé avec l'événement de clic. Ci-dessous, l'extrait de code, la réponse acceptée a également parfaitement fonctionné, j'ajoute cette réponse pour donner un exemple de la façon dont elle peut être utilisée avec les propriétés désactivées et cliquées.

<button (click)="!planNextDisabled && planNext()" [disabled]="planNextDisabled"></button>
pritesh agrawal
la source
2

Si vous utilisez des formulaires réactifs et que vous souhaitez désactiver certaines entrées associées à un contrôle de formulaire, vous devez placer cette disabledlogique dans votre code et appeler yourFormControl.disable()ouyourFormControl.enable()

Sergey P. alias azur
la source
2

Je pense que c'est le moyen le plus simple

<!-- Submit Button-->
<button 
  mat-raised-button       
  color="primary"
  [disabled]="!f.valid"
>
  Submit
</button>
Gouk
la source
1
 <button [disabled]="this.model.IsConnected() == false"
              [ngClass]="setStyles()"
              class="action-button action-button-selected button-send"
              (click)= "this.Send()">
          SEND
        </button>

.ts code

setStyles() 
{
    let styles = {

    'action-button-disabled': this.model.IsConnected() == false  
  };
  return styles;
}
Amir Touitou
la source