J'ai un formulaire en angulaire qui contient deux balises de boutons. Un bouton soumet le formulaire ng-click
. L'autre bouton est uniquement destiné à la navigation ng-click
. Cependant, lorsque ce deuxième bouton est cliqué, AngularJS provoque une actualisation de page qui déclenche un 404. J'ai supprimé un point d'arrêt dans la fonction et il déclenche ma fonction. Si je fais l'une des actions suivantes, cela s'arrête:
- Si je supprime le
ng-click
, le bouton ne provoque pas une actualisation de la page. - Si je commente le code dans la fonction, cela ne provoque pas un rafraîchissement de la page.
- Si je change la balise de bouton en balise d'ancrage (
<a>
) avechref=""
, cela ne provoque pas de rafraîchissement.
Ce dernier semble être la solution de contournement la plus simple, mais pourquoi AngularJS exécute-t-il même du code après ma fonction qui provoque le rechargement de la page? On dirait 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";
};
javascript
angularjs
chubbsondubs
la source
la source
Réponses:
Si vous jetez un œil à la spécification W3C , il semblerait que la chose la plus évidente à essayer est de marquer vos éléments de bouton
type='button'
lorsque vous ne voulez pas qu'ils soient soumis.La chose à noter en particulier est l'endroit où il est dit
la source
$event.preventDefault()
, cela a aidé dans mon cas. Mais je n'ai aucune explication pourquoi: - \Vous pouvez essayer d'empêcher le gestionnaire par défaut:
html:
js:
la source
Vous devez déclarer l'attribut
ng-submit={expression}
dans votre<form>
balise.À partir des documents ngSubmit http://docs.angularjs.org/api/ng.directive:ngSubmit
la source
J'utilise la directive pour empêcher le comportement par défaut:
Et puis, en html:
Cette directive peut également être utilisée avec
<a>
et toutes les autres balisesla source
<form>
balise et que vous ne pouvez donc pas utiliser lang-submit
directive.Vous pouvez conserver
<button type="submit">
, mais vous devez supprimer l'attributaction=""
de<form>
.la source
Je me demande pourquoi personne n'a proposé la solution peut-être la plus simple:
A
<whatever ng-form>
mon humble avis fait un meilleur travail et sans formulaire HTML, il n'y a rien à soumettre par le navigateur lui-même. Quel est exactement le bon comportement lors de l'utilisation angulaire.la source
ng-form=someForm
, vous obtenez$scope.someForm
et il a un$valid
champ. Je reçois donc tout ce dont j'ai besoin<button ng-disabled="!someForm.$valid">
.Ajoutez une action à votre formulaire.
<form action="#">
la source
Cette réponse peut ne pas être directement liée à la question. C'est juste pour le cas où vous soumettez le formulaire à l'aide de scripts.
Selon le code ng-submit
Il ajoute soumettre écouteur d'événements sur le formulaire. Mais le gestionnaire d'événements submit ne serait pas appelé lorsque submit est lancé en appelant form.submit (). Dans ce cas, ng-submit n'empêchera pas l'action par défaut, vous devez appeler vous-même preventDefault dans le gestionnaire ng-submit;
Voir le formulaire soumis à l'aide de submit () à partir d'un lien ne peut pas être détecté par le gestionnaire onsubmit
la source
Le premier bouton soumet le formulaire et le second ne le fait pas
la source
Ajoutez simplement le
FormsModule
dans leimports
tableau deapp.module.ts
fichiers, et ajoutezimport { FormsModule } from '@angular/forms';
en haut de ce fichier ... cela fonctionnera.la source