Unikaj Angular2 do systematycznego wysyłania formularza po kliknięciu przycisku


107

Ok, więc może to jest niejasne. Pobierz ten formularz:

<form (ngSubmit)="submit()" #crisisForm="ngForm">
   <input type="text" name="name" [(ngModel)]="crisis.name">
   <button type="submit">Submit</button>
   <button type="button" (click)="preview()">Preview</button>
   <button type="reset" (click)="reset()">Reset</button>
</form>

Dlaczego wszystkie przyciski wyzwalają tę submit()funkcję? Jak tego uniknąć?


1
return false; z funkcji submit ()
— Aran Dekar,

Odpowiedzi:


213

Widzę dwie możliwości rozwiązania tego problemu:

1) Podaj jawnie type = "button" (myślę, że jest to bardziej preferowane ):

<button type="button" (click)="preview();">Preview</button>

Zgodnie ze specyfikacją W3:

2) zastosowanie $event.preventDefault():

<button (click)="preview(); $event.preventDefault()">Preview</button>

lub

<button (click)="preview($event);">Preview</button>

preview(e){
  e.preventDefault();
  console.log('preview')
}

3
(click)="preview(); false"powinien zrobić to samo. Na przykład stopPropagation()musiałaby zostać wywołana jawnie, ale jeśli procedura obsługi zdarzeń zwróci false, preventDefaultzostanie wywołana w zdarzeniu.
— Günter Zöchbauer

1
@ Günter Zöchbauer Bardzo dziękuję za zwrócenie uwagi! Najpierw spróbowałem, ale napisałem return falsei nie zadziałało :)
— yurzui

1
returnprawdopodobnie nie jest dozwolone w wyrażeniach wiążących, ale wartość ostatniego wyrażenia jest zwracana niejawnie.
— Günter Zöchbauer

2
Korzystanie z # 2 wydaje się najlepszą odpowiedzią. Samo dodanie: type = "button" do mojego przycisku rozwiązało problem
— Michael Washington

1
Nie wiedziałem o type=buttonspecyfikacji W3C. Dziękuję Ci!!
— Hugo H

17

Ten Plunker sugeruje inaczej, każdy przycisk wydaje się działać zgodnie z przeznaczeniem.

Aby jednak zapobiec domyślnemu zachowaniu formularza, możesz to zrobić,


TS:

submit(e){
 e.preventDefault();
}

Szablon:

<form (submit)="submit($event)" #crisisForm="ngForm">

Dzięki za odpowiedź i plnkr ... Chodzi o przycisk typu plnkr.co/edit/BKIqcz7aKBFQDZioZ5Fy
— kfa

w rzeczy samej ! to jest. i zdefiniowałeś na wszystkich przyciskach, więc działało zgodnie z przeznaczeniem
— Ankit Singh

7

Okazało się, że w wersji 2.0 (ngSubmit)przekazuje nullwartość zdarzenia do metody, więc zamiast tego powinieneś nas(submit)

<form (submit)="submit($event)" #crisisForm="ngForm">

Twój plik .ts

submit($event){
   /* form code */
   $event.preventDefault();
}

Dziękuję Ci! To zadziałało, nie wiem, dlaczego ngSubmit działa, gdy nie jest używany jako grupa formularzy, ale kiedy używam go jako grupy formularzy, muszę użyć twojego rozwiązania
— Nikhil Das Nomula

Udzieliłem tej odpowiedzi jakiś czas temu, gdy właśnie wydano 2.0, ale po tym Angular 2 przeszedł długą drogę, więc czy na pewno używasz najnowszej wersji?
— imal hasaranga perera


6

Mam ten sam problem. Prace wokół znalazłem próżniowej buttonz ai zastosować styl do elementu przycisku kotwicy:

<form (ngSubmit)="submit()" #crisisForm="ngForm">
   <input type="text" name="name" [(ngModel)]="crisis.name">
   <button type="submit">Submit</button>
   <a class="btn" (click)="preview()">Preview</a>
   <a class="btn" (click)="reset()">Reset</a>
</form>

6

Musisz zaimportować FormsModule z „@ angular / forms” w swoim app.module.ts

import { FormsModule } from '@angular/forms';
 @NgModule({
  imports: [
    FormsModule
 ],
 })
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.