222 votes

Le fait de cliquer sur un bouton dans un formulaire provoque un rafraîchissement de la page

J'ai un formulaire dans Angular qui contient deux balises de boutons. Un bouton soumet le formulaire sur ng-click . L'autre bouton sert uniquement à la navigation en utilisant ng-click . Cependant, lorsque ce deuxième bouton est cliqué, AngularJS provoque un rafraîchissement de la page, ce qui déclenche une erreur 404. J'ai déposé un point d'arrêt dans la fonction et il déclenche ma fonction. Si je fais l'une des choses suivantes, elle s'arrête :

  1. Si je retire le ng-click le bouton ne provoque pas de rafraîchissement de la page.
  2. Si je commente le code dans la fonction, cela ne provoque pas de rafraîchissement de la page.
  3. Si je remplace la balise du bouton par une balise d'ancrage ( <a> ) avec href="" alors il n'y a pas de rafraîchissement.

Cette dernière solution semble la plus simple, mais pourquoi AngularJS exécute-t-il un code après ma fonction qui provoque le rechargement de la page ? Cela ressemble à un bug.

Voici le formulaire :

<form class="form-horizontal" name="myProfile" ng-switch-when="profile">
  <fieldset>
    <div class="control-group">
      <label class="control-label" for="passwordButton">Password</label>
      <div class="controls">
        <button id="passwordButton" class="secondaryButton" ng-click="showChangePassword()">Change</button>
      </div>
    </div>

    <div class="buttonBar">
      <button id="saveProfileButton" class="primaryButton" ng-click="saveUser()">Save</button>
    </div>
  </fieldset>
</form>

Voici la méthode du contrôleur :

$scope.showChangePassword = function() {
  $scope.selectedLink = "changePassword";
};

0 votes

Voyez si c'est votre problème github.com/angular/angular.js/issues/1238 (Malheureusement, je ne connais pas assez bien github pour être capable de dire si cette correction est dans la version 1.0.1 ou non).

0 votes

Je l'ai vu, mais je ne change pas d'emplacement donc je ne pense pas que ça s'applique. À moins que cet autre bouton n'entraîne l'envoi du formulaire, mais il n'est pas défini comme un type d'envoi, et lorsque j'enlève le ng-click, le bouton n'envoie pas le formulaire.

0 votes

Ce serait formidable si vous pouviez fournir une démonstration fonctionnelle de ce problème. Peut-être en commençant par : Angular Plnkr

489voto

LOAS Points 1690

Si vous jetez un coup d'œil à la Spécification du W3C il semblerait que la chose la plus évidente à faire soit de marquer vos éléments de bouton avec le symbole type='button' quand vous ne voulez pas qu'ils se soumettent.

La chose à noter en particulier est le passage suivant

Un élément bouton sans attribut type spécifié représente la même chose qu'un élément bouton dont l'attribut type est défini sur "submit".

4 votes

J'ai le même problème que OP, mais mes boutons ont le type spécifié - et le fait de cliquer provoque toujours un rafraîchissement. Y a-t-il d'autres endroits où je pourrais regarder ?

0 votes

Cela me suggère que votre problème se situe dans le javascript. Le problème que ma réponse aborde est davantage une question entre le domaine et le navigateur. Un javascript qui gère le clic sur le bouton est probablement à l'origine du rechargement que vous voyez. Bonne chasse ;)

0 votes

C'est exactement ce que je recherchais. C'était très ennuyeux sur ma page parce qu'elle était censée ne montrer que les erreurs et ne pas soumettre.

73voto

antage Points 484

Vous pouvez essayer d'empêcher le gestionnaire par défaut :

html :

<button ng-click="saveUser($event)">

js :

$scope.saveUser = function (event) {
  event.preventDefault();
  // your code
}

0 votes

Joli ! Cela correspond vraiment à mon scénario !

2 votes

Cela a fonctionné pour nous, lorsque nous avons utilisé AngularJS à l'intérieur d'un formulaire SharePoint. J'ai cependant dû ajouter "event.stopPropagation() ;".

19voto

Shane Stillwell Points 1482

Vous devez déclarer l'attribut ng-submit={expression} dans votre <form> étiquette.

Extrait de la documentation de ngSubmit http://docs.angularjs.org/api/ng.directive:ngSubmit

Permet de lier des expressions angulaires aux événements onsubmit.

En outre, il empêche l'action par défaut (qui, pour le formulaire, signifie l'envoi de la demande au serveur et le rechargement de la page actuelle).

3 votes

Vérifiez également que vous n'avez pas défini la propriété 'action' sur le formulaire : form(action="/login", lng-submit="login()") Car cela fera que la page sera rafraîchie même si vous avez défini ng-submit.

0 votes

Soumission d'un formulaire et prévention de l'action par défaut Étant donné que le rôle des formulaires dans les applications Angular côté client est différent de celui des applications roundtrip classiques, il est souhaitable que le navigateur ne traduise pas la soumission du formulaire en un rechargement complet de la page qui envoie les données au serveur. Au lieu de cela, une logique javascript doit être déclenchée pour traiter la soumission du formulaire d'une manière spécifique à l'application. Pour cette raison, Angular empêche l'action par défaut (soumission du formulaire au serveur) à moins que l'élément <form> n'ait un attribut action spécifié. - docs.angularjs.org/api/ng.directive:form

0 votes

J'ai un formulaire avec ng-submit={expression} et un bouton avec type="submit". Cela fonctionne très bien, sauf sur BB10. Si j'utilise le bouton Submit du clavier BB10, la page se rafraîchit. Si j'utilise le bouton que j'ai déclaré dans mon formulaire, cela fonctionne bien.

18voto

Уmed Points 3410

J'utilise une directive pour empêcher le comportement par défaut :

module.directive('preventDefault', function() {
    return function(scope, element, attrs) {
        angular.element(element).bind('click', function(event) {
            event.preventDefault();
            event.stopPropagation();
        });
    }
});

Et ensuite, en html :

<button class="secondaryButton" prevent-default>Secondary action</button>

Cette directive peut également être utilisée avec <a> et tous les autres tags

0 votes

+1 Merci ! C'est utile lorsque vous n'avez pas accès à l'application <form> et ne peut donc pas utiliser la balise ng-submit directive.

0 votes

Merci pour celui-ci, mais je dois aussi annuler le ng-click dans une directive.

0 votes

Cela empêche également le formulaire de déclencher le callback ng-submit, n'est-ce pas ?

-2voto

jasna Points 12
<a href="#pageone" class="ui-btn ui-icon-home ui-btn-icon-right ui-btn-icon-notext ui-btn-right" onClick="history.go(0)">Home</a>

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