66 votes

ngSubmit rafraîchit la page dans le formulaire Angular 2

J'utilise un modèle Angular2 pour créer un formulaire.

Lorsque je clique sur le bouton, les pages s'actualisent.

Mes validations fonctionnent bien.

Comment puis-je arrêter le rafraîchissement de la page lorsque l'utilisateur clique sur un bouton ?

Voici le code HTML que j'utilise : -

<div class="panel panel-default">
    <div class="panel-heading">
        <h3 class="panel-title">Add Employee</h3>
        {{model | json}}
        {{EName.errors | json}}
    </div>
    <div class="panel-body">  
        <form (ngSubmit)="onSubmit(empForm)" #empForm="ngForm" autocomplete="off" novalidate>

        <div class="form-group">
            <label for="EmployeeName">Employee Name</label>
            <input type="text" class="form-control" id="EmployeeName" placeholder="Employee Name" required [(ngModel)]="model.EName" name="EName" #EName="ngModel" ngControl="Ename" #EName="EName" >
            <div *ngIf="EName.touched && EName.errors" >
                <div *ngIf="EName.errors.required"  class="alert alert-danger">
                    Employee Name is required
                </div>
            </div>
        </div>
        <div class="form-group">
            <label for="Age">Age</label>
            <input type="text" class="form-control" id="Age" name="Age" placeholder="Age" [(ngModel)]="model.Age" ngControl="Age">
        </div>
        <div class="form-group">            
            <label for="Sex">Sex</label>
            <div class="d-block">
                <label class="radio-inline">
                    <input type="radio" name="sex" id="Male" value="0" (click)="model.Sex=$event.target.value"> Male
                </label>
                <label class="radio-inline">
                    <input type="radio" name="sex" id="Female" value="1" (click)="model.Sex=$event.target.value"> Female
                </label>
            </div>
        </div>

        <div class="form-group">
            <label for="DOJ">Date of Joining</label>
            <datepicker [(ngModel)]="model.DOJ" name="DOJ"></datepicker>
        </div>

        <div class="form-group">
            <label for="Salary">Salary</label>
            <input type="text" class="form-control" id="Salary" placeholder="Salary" [(ngModel)]="model.Salary" name="Salary">
        </div>

        <div class="form-group">
            <label for="Designation">Designation</label>
            <select id="Designation" name="designation" class="form-control" required [(ngModel)]="model.Designation" name="designation" #desig="ngForm" ngControl="Designation">
                <option value="" selected>-- Select  --</option>
                <option *ngFor="let designation of designations" value="{{ designation.id }}"> 
                    {{designation.name}} 
                </option>
            </select>
            <div [hidden]="desig.valid || desig.pristine" class="alert alert-danger">
                Please select a proper designation.
            </div>
        </div>
        <button type="submit" class="btn btn-default" [disabled] ="!empForm.form.valid">Submit</button>
        </form>
    </div>
</div>

81voto

reda igbaria Points 1194

Il se rafraîchit parce qu'il y a une erreur dans onSubmit gestionnaire.. utiliser event.PreventDefault(); dans le onSubmit :

 <form (ngSubmit)="onSubmit(empForm, $event)" ... >

public onSubmit(empForm: any, event: Event) {
  event.preventDefault();
  .... rest of your code
}

Vous pouvez également vérifier la sortie de la console pour déboguer l'erreur. ... assurez-vous de marquer l'élément preserve log option

preserve log checked in devtools

0 votes

Ce bug se produit dans de rares circonstances, il semble. Certainement pas si les champs de saisie sont vides par défaut.

0 votes

Cette solution, pour autant que je sache, n'est pas compatible avec le compilateur AoT. J'ai essayé tous les moyens auxquels j'ai pu penser, mais je reçois toujours Supplied parameters do not match any signature of call target. .

5 votes

Même si j'ai mis en place event.preventDefault() la fonction onSubmit() provoque un rafraîchissement de la page/un retour en arrière. une idée de la raison ?

78voto

Hamed Baatour Points 3318

Assurez-vous d'importer FormsModule de @angular/forms dans le module contenant votre composant, car sans elle, votre formulaire d'envoi continuera à rafraîchir la page et à échouer silencieusement sans que rien ne soit enregistré dans la console.

import { NgModule }           from '@angular/core';
import { CommonModule }       from '@angular/common';

/*make sure you import it here*/
import { FormsModule }        from '@angular/forms';

 @NgModule({
  /*and add it to the imports array here*/
  imports:      [ FormsModule,  CommonModule],
  declarations: [ YourFormComponent ],
  exports:      [],
  providers:    [],
})

export class FeatureModule{ }

16voto

Günter Zöchbauer Points 21340

A utiliser à la place :

<button type="button"

Le rechargement est causé par le comportement de soumission par défaut du navigateur.

0 votes

Vous avez raison. Je peux changer le type de bouton en bouton, mais comment le faire avec le type de bouton submit. En fait, je suis en train d'apprendre angular2. :)

0 votes

@Saroj onclick="return false ;"

0 votes

@asdf_enel_hak (click)="false" ferait la même chose mais je ne sais pas si Angulars ngSubmit s'appelle alors. Je pense que cela nécessite (click)="form.submit();false" ou quelque chose comme ça, mais type="button" est beaucoup plus facile.

5voto

AWESOME WORLD Points 69

Cela a fonctionné et a empêché le rechargement de toute la page :

  1. J'ai changé le type de bouton de "submit" à "button".
  2. J'ai introduit un (clic)= submitValues() à l'intérieur du bouton props comme ceci :

    soumettre

Cela a empêché le rechargement de la page. J'espère que cela vous aidera.

3voto

vimal dhanush Points 1364

Rafraîchit la page en forme Angular 2 :

Changez le type de bouton de "soumettre" à bouton aucun changement ne peut être reflété.

Solution :

module de formulaire doit être importé dans votre module correspondant. Parce que < formulaire > Sans le module de formulaire, le formulaire est considéré comme un formulaire html, ce qui permet de le rafraîchir.

<form (submit)="onSubmit()">
   <input type="text" name="firstName"/>
   <button type="submit">submit</button>
</form>

Bouton type avec soumettre seulement capable de déclencher le formulaire onsubmit()

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