Düğmeye tıklandığında formu sistematik olarak göndermek için Angular2'den kaçının


107

Tamam, belki bu belirsizdir. Bu formu alın:

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

Neden tüm düğmeler submit()işlevi tetikliyor ? Ve bundan nasıl kaçınılır?


1
yanlış dönüş; submit () fonksiyonunuzdan
Aran Dekar

Yanıtlar:


213

Çözmek için iki seçenek görüyorum:

1) Type = "button" u açıkça belirtin ( daha çok tercih edilir olduğunu düşünüyorum ):

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

W3 spesifikasyonuna göre:

2) Kullanım $event.preventDefault():

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

veya

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

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

3
(click)="preview(); false"aynısını yapmalı. Örneğin stopPropagation(), açıkça çağrılması gerekir, ancak bir olay işleyicisi geri dönerse false, preventDefaultolayda çağrılır.
Günter Zöchbauer

1
@ Günter Zöchbauer Bunu işaret ettiğiniz için çok teşekkürler! Öncelikle denedim ama yazdım return falseve işe yaramadı :)
yurzui

1
returnMuhtemelen bağlama ifadelerinde izin verilmez ancak son ifadenin değeri örtük olarak döndürülür.
Günter Zöchbauer

2
# 2'yi kullanmak en iyi cevap gibi görünüyor.
Michael Washington

1
type=buttonW3C'nin teknik özelliklerini bilmiyordum . Teşekkür ederim!!
Hugo H

17

Bu Plunker aksini öneriyor, her düğme amaçlandığı gibi çalışıyor gibi görünüyor.

Ancak, formun varsayılan davranışını önlemek için bunu yapabilirsiniz,


TS:

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

Şablon:

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

Cevap ve plnkr için teşekkürler ... Bu düğme türü hakkında hepsi plnkr.co/edit/BKIqcz7aKBFQDZioZ5Fy
kfa

aslında ! bu. ve tüm düğmeleri tanımladınız, bu yüzden amaçlandığı gibi çalışıyordu
Ankit Singh

7

2.0 sürümünün yönteme (ngSubmit)bir nullolay değeri ilettiğini buldum, bu yüzden bunun yerine biz(submit)

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

.ts dosyanız

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

Teşekkür ederim! Bu işe yaradı, neden ngSubmit'in bir form grubu olarak kullanılmadığında işe yaradığını bilmeyin, ancak onu bir form grubu olarak kullandığımda çözümünüzü kullanmam gerekiyor
Nikhil Das Nomula

Bu cevabı 2.0 yeni çıktığında bir süre önce vermiştim, ancak bu açısal 2 uzun bir yol kat ettikten sonra en son sürümü kullandığınızdan emin misiniz?
imal hasaranga perera

6

Göndermeyi yürütmek istemediğiniz düğmede type = "button" olarak ayarlayın .


6

Bende de aynı sorun var. I etrafında iş yerini edildi bulundu buttonile ave ankraj elemana düğme stili uygulanır:

<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

App.module.ts içinde '@ angular / formlar'dan FormsModule'u içe aktarmanız gerekir.

import { FormsModule } from '@angular/forms';
 @NgModule({
  imports: [
    FormsModule
 ],
 })
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.