Botão de desativar Angular2

113

Eu sei que no angular2 posso desabilitar um botão com o [disable]atributo, por exemplo:

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

mas posso fazer isso usando [ngClass]ou [ngStyle]? Igual a:

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

Obrigado.

Nir Schwartz
fonte
1
aqui está trabalhando plnkr para o mesmo plnkr.co/edit/MW3vT4XscWcKrDdAwBoE?p=preview
Pardeep Jain

Respostas:

173

Atualizar

Estou pensando. Por que você não quer usar a [disabled]associação de atributos fornecida pelo Angular 2? É a maneira correta de lidar com essa situação. Proponho que você mova seu isValidcheque por meio do método de componente.

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

O problema com o que você tentou explicado abaixo

Basicamente, você pode usar ngClassaqui. Mas adicionar classe não restringiria o evento de disparar. Para disparar o evento em uma entrada válida, você deve alterar o clickcódigo do evento abaixo. Portanto, isso onConfirmserá acionado apenas quando o campo for válido.

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

Demonstração aqui

Pankaj Parkar
fonte
Bem, eu adicionei aquele ngClass já no botão para que me pareça que precisa estar desabilitado, por que o modo [desabilitado] é preferido?
Nir Schwartz de
@NirSchwartz porque fará as duas coisas ao mesmo tempo .. as regras do seletor css serão aplicadas no button[disabled]seletor e o evento desabilitado restringirá o clickevento para disparar no botão .. na ngClassaula, você precisa lidar com isso sozinho, como mostrei em resposta acima ..
Pankaj Parkar
A razão pela qual as pessoas desejam usar [attr.disabled] em vez de [disabled] é porque o FormControl angular [disabled] não pode ser definido dinamicamente. Aqui está o problema github.com/angular/angular/issues/11271
davyzhang
1
Você não deve chamar um método em uma associação de modelo. [disabled]="!isValid"
Tom
3
Ahhaa .. se o método tem apenas uma referência de variável, tudo bem .. Se você tem uma lógica complexa dentro de uma função, então ela não é a preferida. Você está correto, neste caso posso chamar diretamente o isValidsinalizador na IU
Pankaj Parkar
39

Eu recomendaria o seguinte.

<button [disabled]="isInvalid()">Submit</button>
Proximo
fonte
4
Não é melhor evitar chamadas de função em html, como será chamado a cada tick / ciclo?
John
5

Usar ngClasspara desabilitar o botão para formulário inválido não é uma boa prática no Angular2 ao fornecer recursos embutidos para habilitar e desabilitar o botão se o formulário for válido e inválido, respectivamente, sem fazer nenhum esforço / lógica extra.

[disabled] fará tudo como se o formulário for válido, então ele será habilitado e se o formulário for inválido, ele será desabilitado automaticamente.

Consultar exemplo:

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

Folga
fonte
3

Pode estar abaixo do código pode ajudar:

<button [attr.disabled]="!isValid ? true : null">Submit</button>
Shivang Gupta
fonte
Esta não é uma boa solução, pois <button disabled="">ou <button disabled="false">ainda é tratada como um botão desativado na maioria dos navegadores
BillyTom
2

Tentei usar disabled junto com o evento click. Abaixo está o snippet, a resposta aceita também funcionou perfeitamente. Estou adicionando esta resposta para dar um exemplo de como ela pode ser usada com as propriedades disabled e click.

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

Se você estiver usando formulários reativos e quiser desabilitar alguma entrada associada a um controle de formulário, você deve colocar essa disabledlógica em seu código e chamar yourFormControl.disable()ouyourFormControl.enable()

Sergey P. também conhecido como azul
fonte
2

Eu acho que essa é a maneira mais fácil

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