Przycisk wyłączania Angular2


113

Wiem, że w angular2 mogę wyłączyć przycisk z [disable]atrybutem np:

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

ale czy mogę to zrobić za pomocą [ngClass]lub [ngStyle]? Tak jak to:

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

Dzięki.


1
tutaj działa plnkr dla tego samego plnkr.co/edit/MW3vT4XscWcKrDdAwBoE?p=preview
Pardeep Jain

Odpowiedzi:


173

Aktualizacja

Zastanawiam się. Dlaczego nie chcesz użyć [disabled]powiązania atrybutów dostarczonego przez Angular 2? To właściwy sposób radzenia sobie z tą sytuacją. Proponuję przenieść isValidczek metodą komponentów.

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

Problem z tym, co próbowałeś, został wyjaśniony poniżej

Zasadniczo możesz użyć ngClasstutaj. Ale dodanie klasy nie uniemożliwiłoby wystrzelenia zdarzenia. Aby uruchomić zdarzenie przy poprawnym wejściu, powinieneś zmienić clickkod zdarzenia na poniżej. Więc to onConfirmzostanie uruchomione tylko wtedy, gdy pole jest prawidłowe.

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

Demo tutaj


Cóż, dodam, że ngClass jest już w przycisku, więc wydaje mi się, że wyłączony musi być inny, dlaczego preferowany jest sposób [wyłączony]?
Nir Schwartz,

@NirSchwartz, ponieważ będzie robił obie rzeczy na raz .. Reguły css selektora zostaną zastosowane w button[disabled]przypadku zdarzenia opartego na selektorze i wyłączone, ograniczą clickzdarzenie do uruchomienia na przycisku .. w ngClassklasowej rzeczy musisz sobie z tym poradzić samodzielnie, jak pokazano w powyższa odpowiedź ..
Pankaj Parkar

Powodem, dla którego ludzie chcą używać [attr.disabled] zamiast [disabled], jest to, że [disabled] angular FormControl nie można ustawić dynamicznie. Oto problem github.com/angular/angular/issues/11271
davyzhang

1
Nie powinieneś wywoływać metody w powiązaniu szablonu. [disabled]="!isValid"
Tom

3
Ahhaa .. jeśli metoda ma tylko odniesienie do zmiennej, to jest w porządku .. Jeśli masz złożoną logikę wewnątrz funkcji, nie jest to preferowane. Masz rację, w tym przypadku mogę bezpośrednio wywołać isValidflagę na UI
Pankaj Parkar

39

Poleciłbym następujące.

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

4
Czy nie lepiej unikać wywołań funkcji w html, ponieważ będą one nazywane każdym tikiem / cyklem?
John



5

Użycie ngClassdo wyłączenia przycisku dla nieprawidłowego formularza nie jest dobrą praktyką w Angular2, gdy zapewnia on wbudowane funkcje włączania i wyłączania przycisku, jeśli formularz jest prawidłowy i nieprawidłowy, bez wykonywania dodatkowych wysiłków / logiki.

[disabled] zrobi wszystko, na przykład jeśli formularz jest ważny, zostanie włączony, a jeśli formularz jest nieprawidłowy, zostanie automatycznie wyłączony.

Zobacz przykład:

<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

Może pomóc poniższy kod:

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

To nie jest dobre rozwiązanie, ponieważ <button disabled="">albo <button disabled="false">jest nadal traktowane jak przycisk niepełnosprawnych w większości przeglądarek
BillyTom

2

Próbowałem używać wyłączonych razem ze zdarzeniem kliknięcia. Poniżej znajduje się fragment, zaakceptowana odpowiedź również działała idealnie, dodaję tę odpowiedź, aby dać przykład, jak można jej używać z wyłączonymi i kliknięciami właściwości.

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

2

Jeśli używasz formularzy reaktywnych i chcesz wyłączyć niektóre dane wejściowe powiązane z kontrolką formularza, powinieneś umieścić tę disabledlogikę w swoim kodzie i wywołać yourFormControl.disable()lubyourFormControl.enable()


2

Myślę, że to najłatwiejszy sposób

<!-- 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>

.ts kod

setStyles() 
{
    let styles = {

    'action-button-disabled': this.model.IsConnected() == false  
  };
  return styles;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.