Уникайте 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
повернути помилкове; від функції подання ()
Аран Декар

Відповіді:


213

Я бачу два варіанти її вирішення:

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він викликається на подію.
Гюнтер Зехбауер

1
@ Günter Zöchbauer Дуже дякую за те, що вказував на це! По-перше, я спробував це, але я написав, return falseі це не вийшло :)
yurzui

1
returnймовірно, не допускається в виразах зв'язування, але значення останнього виразу повертається неявно.
Günter Zöchbauer

2
Використання №2 здається найкращою відповіддю. Просто додавання: type = "button" до моєї кнопки вирішило проблему
Michael Washington

1
Я не знав про type=buttonспецифікацію W3C. Дякую!!
Хьюго

17

Цей Plunker пропонує інакше, кожна кнопка, здається, працює за призначенням.

Однак, щоб запобігти поведінці форми за замовчуванням, ви можете це зробити,


TS:

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

Шаблон:

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

Дякую за відповідь і plnkr ... Все про тип кнопки plnkr.co/edit/BKIqcz7aKBFQDZioZ5Fy
kfa

справді! Це є. і ви визначили на всіх кнопок, так що це працювало за призначенням
Анкіт Сінгх

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 щойно вийшов, але після цього кутовий 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
 ],
 })
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.