Ich habe ein Formular in Angular, das zwei Schaltflächen-Tags enthält. Eine Schaltfläche sendet das Formular weiter ng-click
. Die andere Schaltfläche dient ausschließlich zur Navigation ng-click
. Wenn Sie jedoch auf diese zweite Schaltfläche klicken, führt AngularJS eine Seitenaktualisierung durch, die eine 404 auslöst. Ich habe einen Haltepunkt in der Funktion gelöscht und er löst meine Funktion aus. Wenn ich eine der folgenden Aktionen ausführe, wird sie gestoppt:
- Wenn ich das entferne
ng-click
, bewirkt die Schaltfläche keine Seitenaktualisierung. - Wenn ich den Code in der Funktion auskommentiere, wird keine Seitenaktualisierung durchgeführt.
- Wenn ich das Schaltflächen-Tag in ein Anker-Tag (
<a>
) mit änderehref=""
, wird keine Aktualisierung durchgeführt.
Letzteres scheint die einfachste Problemumgehung zu sein, aber warum führt AngularJS nach meiner Funktion überhaupt Code aus, der das Neuladen der Seite bewirkt? Scheint wie ein Fehler.
Hier ist das Formular:
<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>
Hier ist die Controller-Methode:
$scope.showChangePassword = function() {
$scope.selectedLink = "changePassword";
};
javascript
angularjs
Chubbsondubs
quelle
quelle
Antworten:
Wenn Sie sich die W3C-Spezifikation ansehen , ist es naheliegend, Ihre Schaltflächenelemente mit zu markieren,
type='button'
wenn Sie nicht möchten, dass sie gesendet werden.Besonders zu beachten ist, wo es heißt
quelle
$event.preventDefault()
, das hat in meinem Fall geholfen. Aber ich habe keine Erklärung warum: - \Sie können versuchen, den Standardhandler zu verhindern:
html:
js:
quelle
Sie sollten das Attribut
ng-submit={expression}
in Ihrem<form>
Tag deklarieren .Aus den ngSubmit-Dokumenten http://docs.angularjs.org/api/ng.directive:ngSubmit
quelle
Ich benutze Direktive, um Standardverhalten zu verhindern:
Und dann in HTML:
Diese Anweisung kann auch mit
<a>
und allen anderen Tags verwendet werdenquelle
<form>
Tag haben und daher dieng-submit
Direktive nicht verwenden können .Sie können behalten
<button type="submit">
, müssen aber das Attributaction=""
von entfernen<form>
.quelle
Ich frage mich, warum niemand die möglicherweise einfachste Lösung vorgeschlagen hat:
A
<whatever ng-form>
macht meiner Meinung nach einen besseren Job und ohne ein HTML-Formular kann der Browser selbst nichts einreichen. Welches ist genau das richtige Verhalten bei der Verwendung von Winkel.quelle
ng-form=someForm
, bekommen Sie$scope.someForm
und es hat ein$valid
Feld. So bekomme ich alles was ich brauche<button ng-disabled="!someForm.$valid">
.Fügen Sie Ihrem Formular eine Aktion hinzu.
<form action="#">
quelle
Diese Antwort steht möglicherweise nicht in direktem Zusammenhang mit der Frage. Dies gilt nur für den Fall, dass Sie das Formular mithilfe von Skripten senden.
Laut ng-submit Code
Dem Formular wird der Listener für Übermittlungsereignisse hinzugefügt. Der Submit-Ereignishandler wird jedoch nicht aufgerufen, wenn Submit durch Aufrufen von form.submit () initiiert wird. In diesem Fall verhindert ng-submit die Standardaktion nicht. Sie müssen PreventDefault selbst im ng-submit-Handler aufrufen.
Siehe Formular, das mit submit () von einem Link gesendet wurde, kann vom onsubmit-Handler nicht abgefangen werden
quelle
Der erste Button sendet das Formular und der zweite nicht
quelle
Fügen Sie einfach das
FormsModule
in dasimports
Array derapp.module.ts
Datei ein und fügen Sie esimport { FormsModule } from '@angular/forms';
oben in diese Datei ein ... das wird funktionieren.quelle