115 votes

Éviter qu'Angular2 ne soumette systématiquement le formulaire au clic d'un bouton

Ok, peut-être que ce n'est pas clair. Obtenez ce formulaire :

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

Pourquoi tous les boutons déclenchent-ils la fonction submit() fonction ? Et comment éviter cela ?

1 votes

Return false ; de votre fonction submit()

231voto

yurzui Points 85802

Je vois deux options pour résoudre ce problème :

1) Préciser type="button" explicitement (je pense que c'est plus préférable ):

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

Selon la spécification W3 :

2) Utiliser $event.preventDefault() :

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

o

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

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

3 votes

(click)="preview(); false" devraient faire de même. A titre d'exemple stopPropagation() devrait être appelé de manière explicite, mais si un gestionnaire d'événement renvoie false alors preventDefault est appelé sur l'événement.

1 votes

@Günter Zöchbauer Merci beaucoup de l'avoir signalé ! J'ai d'abord essayé mais j'ai écrit return false et cela n'a pas fonctionné :)

1 votes

return n'est probablement pas autorisé dans les expressions de liaison, mais la valeur de la dernière expression est renvoyée implicitement.

17voto

Ankit Singh Points 15545

Ce Plunker suggère que dans le cas contraire, chaque bouton semble fonctionner comme prévu.

Cependant, pour empêcher le comportement par défaut du formulaire, vous pouvez procéder comme suit,


TS :

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

Modèle :

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

0 votes

Merci pour la réponse et le plnkr... Tout dépend du type de bouton plnkr.co/edit/BKIqcz7aKBFQDZioZ5Fy

0 votes

En effet ! c'est le cas. et vous avez défini tous les boutons, ce qui signifie que le système fonctionne comme prévu

7voto

imal365 Points 39

J'ai constaté qu'avec la version 2.0 (ngSubmit) passe un null à la méthode, vous devez donc utiliser la méthode (submit)

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

votre fichier .ts

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

0 votes

Nous vous remercions ! Je ne sais pas pourquoi ngSubmit fonctionne quand il n'est pas utilisé comme groupe de formulaire, mais quand je l'utilise comme groupe de formulaire, je dois utiliser votre solution.

0 votes

J'ai donné cette réponse il y a quelques temps lorsque la version 2.0 venait d'être publiée, mais après cela, angular 2 a parcouru un long chemin, alors êtes-vous sûr d'utiliser la dernière version ?

6voto

Alexis Gamarra Points 121

Set (jeu de mots) type="button" dans le bouton que vous ne voulez pas soumettre à l'exécution.

6voto

Arun Ghosh Points 5280

J'ai le même problème. La solution que j'ai trouvée consiste à remplacer button avec a et appliquer le style bouton à l'élément d'ancrage :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X