Evita che Angular2 invii sistematicamente il modulo al clic del pulsante


107

Ok, forse questo non è chiaro. Ottieni questo modulo:

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

Perché tutti i pulsanti attivano la submit()funzione? E come evitarlo?


1
return false; dalla funzione submit ()
Aran Dekar

Risposte:


213

Vedo due opzioni per risolverlo:

1) Specifica esplicitamente type = "button" (penso sia più preferibile ):

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

Secondo la specifica W3:

2) Usa $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"dovrebbe fare lo stesso. Ad esempio, stopPropagation()dovrebbe essere chiamato esplicitamente, ma se un gestore di eventi ritorna false, preventDefaultviene chiamato sull'evento.
Günter Zöchbauer

1
@ Günter Zöchbauer Grazie mille per averlo segnalato! Per prima cosa l'ho provato ma ho scritto return falsee non ha funzionato :)
yurzui

1
returnprobabilmente non è consentito nelle espressioni di associazione, ma il valore dell'ultima espressione viene restituito implicitamente.
Günter Zöchbauer

2
L'uso del n. 2 sembra la migliore risposta. Basta aggiungere: type = "button" al mio pulsante ha risolto il problema
Michael Washington

1
Non sapevo type=buttondelle specifiche del W3C. Grazie!!
Hugo H

17

Questo Plunker suggerisce il contrario, ogni pulsante sembra funzionare come previsto.

Tuttavia, per impedire il comportamento predefinito del modulo puoi farlo,


TS:

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

Modello:

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

Grazie per la risposta e il plnkr ... Riguarda il tipo di pulsante plnkr.co/edit/BKIqcz7aKBFQDZioZ5Fy
kfa

infatti ! è. e hai definito tutti i pulsanti, quindi funzionava come previsto
Ankit Singh

7

Ho scoperto che con la versione 2.0 (ngSubmit)viene passato un nullvalore di evento al metodo, quindi dovresti usarlo(submit)

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

il tuo file .ts

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

Grazie! Ha funzionato, non so perché ngSubmit funziona quando non viene utilizzato come gruppo di moduli, ma quando lo uso come gruppo di moduli devo usare la tua soluzione
Nikhil Das Nomula

Ho dato questa risposta qualche tempo fa quando 2.0 è appena stato rilasciato, ma dopo che angular 2 ha fatto molta strada, quindi sei sicuro di utilizzare l'ultima versione di rilascio?
imal hasaranga perera


6

Ho lo stesso problema. Il lavoro attorno ho trovato è stata la sostituzione buttoncon ae applicare lo stile pulsante per elemento di ancoraggio:

<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

Devi importare FormsModule da "@ angular / forms" nel tuo app.module.ts

import { FormsModule } from '@angular/forms';
 @NgModule({
  imports: [
    FormsModule
 ],
 })
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.