หลีกเลี่ยง Angular2 เพื่อส่งแบบฟอร์มอย่างเป็นระบบเมื่อคลิกปุ่ม


107

โอเคอาจจะยังไม่ชัดเจน รับแบบฟอร์มนี้:

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

ทำไมปุ่มทั้งหมดจึงเรียกใช้submit()ฟังก์ชันนี้ และจะหลีกเลี่ยงสิ่งนั้นได้อย่างไร?


1
กลับเท็จ จากฟังก์ชัน submit () ของคุณ
Aran Dekar

คำตอบ:


214

ฉันเห็นสองตัวเลือกในการแก้ปัญหา:

1) ระบุtype = "button"อย่างชัดเจน (ฉันคิดว่าน่าจะดีกว่า ):

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

ตามข้อกำหนด W3:

  • http://w3c.github.io/html-reference/button.html

    องค์ประกอบปุ่ม ด้วย แอตทริบิวต์ประเภทไม่ ระบุหมายถึงสิ่งเดียวกันเป็นปุ่ม องค์ประกอบด้วยชุดประเภทแอตทริบิวต์ "ส่ง"

2) การใช้งาน$event.preventDefault():

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

หรือ

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

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

3
(click)="preview(); false"ควรทำเช่นเดียวกัน ตัวอย่างเช่นstopPropagation()จะต้องเรียกอย่างชัดเจน แต่ถ้าตัวจัดการเหตุการณ์กลับfalseมาระบบpreventDefaultจะเรียกเหตุการณ์นั้น
GünterZöchbauer

1
@ GünterZöchbauerขอบคุณมากที่ชี้ให้เห็น! ประการแรกฉันลอง แต่เขียนreturn falseแล้วไม่ได้ผล :)
yurzui

1
returnอาจไม่ได้รับอนุญาตในนิพจน์การผูก แต่ค่าของนิพจน์สุดท้ายจะถูกส่งกลับโดยปริยาย
GünterZöchbauer

2
การใช้ # 2 ดูเหมือนจะเป็นคำตอบที่ดีที่สุด เพียงแค่เพิ่ม: type = "button" ในปุ่มของฉันก็สามารถแก้ปัญหาได้
Michael Washington

1
ฉันไม่รู้เกี่ยวกับtype=buttonสเป็คของ W3C ขอบคุณ!!
Hugo H

17

Plunker นี้แนะนำเป็นอย่างอื่นทุกปุ่มดูเหมือนจะทำงานตามที่ตั้งใจไว้

อย่างไรก็ตามเพื่อป้องกันพฤติกรรมเริ่มต้นของแบบฟอร์มคุณสามารถทำได้


TS:

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

แม่แบบ:

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

ขอบคุณสำหรับคำตอบและ plnkr ... ทุกอย่างเกี่ยวกับปุ่มประเภทplnkr.co/edit/BKIqcz7aKBFQDZioZ5Fy
kfa

แน่นอน! มันคือ. และคุณได้กำหนดไว้บนปุ่มทั้งหมดดังนั้นมันจึงทำงานได้ตามที่ตั้งใจไว้
Ankit Singh

7

ฉันพบว่าด้วยการเปิดตัว 2.0 (ngSubmit)กำลังส่งผ่านnullค่าเหตุการณ์ไปยังเมธอดดังนั้นคุณควรให้เราแทน(submit)

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

ไฟล์. ts ของคุณ

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

ขอบคุณ! วิธีนี้ใช้ได้ผลไม่ทราบว่าเหตุใด ngSubmit จึงทำงานเมื่อไม่ได้ใช้เป็นกลุ่มฟอร์ม แต่เมื่อฉันใช้เป็นกลุ่มแบบฟอร์มฉันต้องใช้โซลูชันของคุณ
Nikhil Das Nomula

ฉันให้คำตอบนี้ย้อนกลับไปเมื่อ 2.0 เพิ่งเปิดตัว แต่หลังจากนั้น angular 2 ก็มาไกลแล้วคุณแน่ใจหรือไม่ว่าคุณใช้เวอร์ชันล่าสุด
imal hasaranga perera


6

ฉันมีปัญหาเดียวกัน การทำงานรอบ ๆ ผมพบว่าถูกแทนที่buttonด้วยaและใช้รูปแบบปุ่มไปยังองค์ประกอบสมอ:

<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

คุณต้องนำเข้า FormsModule จาก "@ angular / form" ใน app.module.ts ของคุณ

import { FormsModule } from '@angular/forms';
 @NgModule({
  imports: [
    FormsModule
 ],
 })
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.