Hindari Angular2 untuk mengirimkan formulir secara sistematis saat mengklik tombol


107

Ok jadi mungkin ini tidak jelas. Dapatkan formulir ini:

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

Mengapa semua tombol memicu submit()fungsi tersebut? Dan bagaimana cara menghindarinya?


1
return false; dari fungsi submit () Anda
— Aran Dekar

Jawaban:


213

Saya melihat dua opsi untuk menyelesaikannya:

1) Tentukan type = "button" secara eksplisit (menurut saya ini lebih disukai ):

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

Menurut spesifikasi W3:

2) Gunakan $event.preventDefault():

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

atau

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

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

3
(click)="preview(); false"harus melakukan hal yang sama. Misalnya stopPropagation()perlu dipanggil secara eksplisit, tetapi jika penangan peristiwa kembali false, maka preventDefaultakan dipanggil pada acara tersebut.
— Günter Zöchbauer

1
@ Günter Zöchbauer Terima kasih banyak telah menunjukkan hal ini! Pertama saya mencobanya tapi saya menulis return falsedan tidak berhasil :)
— yurzui

1
returnmungkin tidak diperbolehkan dalam ekspresi yang mengikat tetapi nilai ekspresi terakhir dikembalikan secara implisit.
— Günter Zöchbauer

2
Menggunakan # 2 sepertinya merupakan jawaban terbaik. Hanya menambahkan: type = "button" ke tombol saya memecahkan masalah
— Michael Washington

1
Saya tidak tahu tentang type=buttonspesifikasi W3C. Terima kasih!!
— Hugo H

17

Plunker ini menyarankan sebaliknya, setiap tombol tampaknya berfungsi sebagaimana mestinya.

Namun, untuk mencegah perilaku default formulir Anda bisa melakukan ini,


TS:

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

Template:

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

Terima kasih atas jawabannya dan plnkr ... Ini semua tentang jenis tombol plnkr.co/edit/BKIqcz7aKBFQDZioZ5Fy
— kfa

memang ! ini. dan Anda telah menentukan pada semua tombol, sehingga berfungsi sebagaimana mestinya
— Ankit Singh

7

Saya menemukan bahwa dengan rilis 2.0 (ngSubmit)melewati nullnilai acara ke metode, jadi Anda harus kami(submit)

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

file .ts Anda

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

Terima kasih! Ini berhasil, jangan tahu mengapa ngSubmit berfungsi ketika tidak digunakan sebagai grup formulir, tetapi ketika saya menggunakannya sebagai grup formulir, saya harus menggunakan solusi Anda
— Nikhil Das Nomula

Saya memberikan jawaban ini beberapa waktu yang lalu ketika 2.0 baru saja dirilis, tetapi setelah itu sudut 2 telah berkembang pesat jadi apakah Anda yakin Anda menggunakan versi rilis terbaru?
— imal hasaranga perera


6

Saya memiliki masalah yang sama. Pekerjaan yang saya temukan adalah mengganti buttondengan adan menerapkan gaya tombol ke elemen jangkar:

<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

Anda harus mengimpor FormsModule dari '@ angular / forms' di app.module.ts Anda

import { FormsModule } from '@angular/forms';
 @NgModule({
  imports: [
    FormsModule
 ],
 })
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.