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.

Nir Schwartz
źródło
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

Pankaj Parkar
źródło
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>
Proximo
źródło
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="">

Luźny
źródło
3

Może pomóc poniższy kod:

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

Sergey P. alias lazurowy
źródło
2

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

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