Evite que Angular2 envíe el formulario sistemáticamente al hacer clic en el botón


107

Ok, tal vez esto no esté claro. Obtenga este formulario:

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

¿Por qué todos los botones activan la submit()función? ¿Y cómo evitarlo?


1
falso retorno; desde su función submit ()
Aran Dekar

Respuestas:


213

Veo dos opciones para solucionarlo:

1) Especifique type = "button" explícitamente (creo que es más preferible ):

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

Según la especificación W3:

2) Uso $event.preventDefault():

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

o

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

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

3
(click)="preview(); false"debería hacer lo mismo. Por ejemplo, stopPropagation()sería necesario llamarlo explícitamente, pero si un controlador de eventos regresa false, entonces preventDefaultse llama en el evento.
Günter Zöchbauer

1
@ Günter Zöchbauer ¡Muchas gracias por señalar esto! Primero lo probé, pero escribí return falsey no funcionó :)
yurzui

1
returnProbablemente no esté permitido en expresiones vinculantes, pero el valor de la última expresión se devuelve implícitamente.
Günter Zöchbauer

2
Usar el n. ° 2 parece la mejor respuesta. Simplemente agregando: type = "button" a mi botón resolvió el problema
Michael Washington

1
No conocía type=buttonlas especificaciones del W3C. ¡¡Gracias!!
Hugo H

17

Este Plunker sugiere lo contrario, todos los botones parecen funcionar según lo previsto.

Sin embargo, para evitar el comportamiento predeterminado del formulario, puede hacer esto,


TS:

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

Modelo:

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

Gracias por la respuesta y el plnkr ... Se trata del tipo de botón plnkr.co/edit/BKIqcz7aKBFQDZioZ5Fy
kfa

en efecto ! es. y ha definido en todos los botones, por lo que funcionó según lo previsto
Ankit Singh

7

Descubrí que con la versión 2.0 (ngSubmit)se pasa un nullvalor de evento al método, por lo que debería(submit)

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

su archivo .ts

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

¡Gracias! Esto funcionó, no sé por qué ngSubmit funciona cuando no se usa como un grupo de formulario, pero cuando lo uso como un grupo de formulario, tengo que usar su solución
Nikhil Das Nomula

Di esta respuesta hace algún tiempo cuando se lanzó 2.0, pero después de que angular 2 ha recorrido un largo camino, ¿está seguro de que está utilizando la última versión de lanzamiento?
imal hasaranga perera


6

Tengo el mismo problema. El trabajo en torno a lo que encontré fue la sustitución buttoncon ay aplicar estilo de botón de elemento de anclaje:

<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

Tienes que importar FormsModule desde '@ angular / forms' en tu app.module.ts

import { FormsModule } from '@angular/forms';
 @NgModule({
  imports: [
    FormsModule
 ],
 })
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.