if-Anweisung in ng-click

73

Gibt es eine Möglichkeit, eine Bedingung in einen ng-Klick einzufügen? Hier möchte ich, dass das Formular nicht gesendet wird, wenn Formularfehler vorliegen, aber dann habe ich eine Analyse-Ausnahme erhalten.

 <input  ng-click="{{if(profileForm.$valid) updateMyProfile()}}" name="submit" id="submit" value="Save" class="submit" type="submit">

Ich habe versucht, ng-disabled zu verwenden, aber dann funktioniert mein Validierungs-Plugin nicht, da das Formular überhaupt nicht gesendet wird und daher nicht ausgelöst wird.

Frühling
quelle
@ Falinsky NEIN, das hat mir nicht geholfen
Frühling
Überprüfen Sie die Antwort auf diese Frage: So stellen Sie eine Bedingung für ng-click in AngularJS her . Es ist entweder ng-click = "profileForm. $ Valid && updateMyProfile ()" oder ng-click = "profileForm. $ Invalid || updateMyProfile ()"
Weihui Guo

Antworten:

149

Fügen Sie keinen Bedingungsausdruck in die Vorlage ein.

Mach es am Controller.

Vorlage:

<input ng-click="check(profileForm.$valid)" name="submit" 
       id="submit" value="Save" class="submit" type="submit">

Regler:

$scope.check = function(value) {
    if (value) {
       updateMyProfile();
    }
}
Chen-Tsu Lin
quelle
35
Beispiel: Wenn <a ng-click="pluginsChanged ? restartServer($event) : null" href="https://stackoverflow.com/">Back</a>Sie sich nur den HTML-Code ansehen, ist es sehr offensichtlich, dass beim Klicken auf diesen Link, wenn sich die Plugins geändert haben, der Server neu gestartet wird, da sonst nichts Besonderes passiert. Wenn ich das in den Controller gestellt hätte, hätte ich eine separate Funktion benötigt, weil ich restartServeranderswo verwende, und es wäre im HTML nicht offensichtlich, was passiert.
Jonathan.
1
Wenn sich später eine andere Person fragt, warum der Server manchmal neu gestartet wird, wenn auf die Schaltfläche "Zurück" geklickt wird, ist dies sofort ersichtlich. Anstatt dass sie die Funktion suchen und sehen müssen, unter welchen Bedingungen sie neu gestartet wird.
Jonathan.
6
Entschuldigung, aber ich kann diese Antwort nicht als nützlich erachten. Sie erklären sie nicht, @Jonathan. 's Kommentar ist gültig
Pedro Justo
1
Es ist eine richtige Antwort. Durchflussbedingungen sind Teil der Logik und sollten daher in die Steuerung eingefügt werden. Angular bietet if- und show-Anweisungen, um Änderungen "darzustellen", aber auch diese sollten durch die Steuerung geleitet werden.
Manatax
1
Dies ist eine perfekte Antwort. Sie setzen keine Logik in Ihre Ansicht ein. Eine if-Anweisung ist genau diese Logik. Sie führen Funktionsaufrufe durch, die vom Controller verarbeitet werden. Manchmal wird die Logik für diese Funktion an einen Dienst delegiert, wenn sie in verschiedenen Bereichen Ihrer Site wiederholt und verwendet werden kann.
Eric Bishard
58

Dies ist möglicherweise irrelevant und nutzlos, aber da es sich um Javascript handelt, müssen Sie das Ternär nicht wie oben in der ng-click-Anweisung vorgeschlagen verwenden. Sie sollten auch in der Lage sein, die Syntax für die verzögerte Auswertung ("oder die") zu verwenden. Also für Ihr Beispiel oben:

<input  ng-click="{{if(profileForm.$valid) updateMyProfile()}}" name="submit" id="submit" value="Save" class="submit" type="submit">

würde werden:

<input  ng-click="profileForm.$valid && updateMyProfile()" name="submit" id="submit" value="Save" class="submit" type="submit">

In diesem Fall passiert nichts, wenn das Profil nicht gültig ist. Andernfalls wird updateMyProfile () aufgerufen. Wie in dem Link, den @falinsky oben bereitstellt.

Rob Wilson
quelle
es sollte sein "wenn das Profil NICHT gültig ist, dann passiert nichts"
Frühling
2
Dies ist der richtige Weg für diese Antwort auf eine Frage, die eine schlechte Praxis umsetzt. Aber genau wie bei der anderen Antwort ist es keine bewährte Methode. Zumindest wenn Logik in der Ansicht implementiert ist, sollten Sie sich fragen: A) Muss ich dies möglicherweise jemals ändern, und wenn diese Antwort Ja lautet, müssen Sie diese Logik in der Steuerung ausführen. Sie beginnen dies auf Ihrer gesamten Website und es wird sehr schwierig sein, in Zukunft etwas zu testen oder zu ändern. Dies ist ein Einstiegsmittel gegen viele Kopfschmerzen.
Eric Bishard
IMO, dies ist die beste Lösung für das gegebene Problem. Wenn die Gültigkeitsbedingung etwas komplex ist, kann sie sicher in die Steuerung eingehen. Vielen Dank!
Kalpesh Panchal
34

Hier ist ein Hack, den ich entdeckt habe und der für Sie funktionieren könnte, obwohl er nicht schön ist und es mir persönlich peinlich wäre, eine solche Codezeile zu verwenden:

ng-click="profileForm.$valid ? updateMyProfile() : alert('failed')"

Jetzt müssen Sie nachdenken, aber ich möchte nicht, dass es alarmiert ("fehlgeschlagen"), wenn meine profileFormnicht gültig ist. Nun, das ist der hässliche Teil. Für mich wird, egal was ich in die else-Klausel dieser ternären Anweisung einfüge, nie ausgeführt.

Wenn es jedoch entfernt wird, wird ein Fehler ausgegeben. Sie können es also einfach mit einem sinnlosen Alarm füllen.
Ich habe dir gesagt, dass es hässlich ist ... aber ich bekomme nicht einmal Fehler, wenn ich so etwas mache.
Der richtige Weg, dies zu tun, ist, wie Chen-Tsu erwähnte, aber für jeden seinen eigenen.

stackPusher
quelle
2
Manchmal ist es einfach sinnvoll, dies in der Vorlage zu tun. Danke für den Tipp. Bekam den Fehler zwei, weil der Ternär ein positives und negatives Ergebnis will. Das hat bei mir funktioniert:ciCtrl.iconSelections.style === 2 ? ciCtrl.iconSelections.style = 1 : blah
Justin Noel
Ich benutze so etwas an mehreren Stellen. ng-class = "column.columnname! = 'vendor'? 'alt-content-hoverable': false"
Deathstalker
13

Wenn Sie dies auf diese Weise tun müssen, haben Sie folgende Möglichkeiten:

Deaktivieren der Schaltfläche bei deaktiviertem ng

Mit Abstand die einfachste Lösung.

<input ng-disabled="!profileForm.$valid" ng-click="updateMyProfile()" ... >

Verstecke die Schaltfläche (und zeige etwas anderes) mit ng-if

Könnte in Ordnung sein, wenn Sie ein komplexes Markup ein- oder ausblenden.

<div ng-if="profileForm.$valid">
    <input ng-click="updateMyProfile()" ... >
</div>
<div ng-if="!profileForm.$valid">
    Sorry! We need all form fields properly filled out to continue.
</div>

(Denken Sie daran, es gibt keine ng-else...)

Eine Mischung aus beidem

Kommunizieren Sie mit dem Benutzer, wo sich die Schaltfläche befindet (er sucht nicht mehr danach), erklären Sie jedoch, warum nicht darauf geklickt werden kann.

<input ng-disabled="!profileForm.$valid" ng-click="updateMyProfile()" ... >
<div ng-if="!profileForm.$valid">
    Sorry! We need all form fields properly filled out to continue.
</div>

quelle
5

Wir können ng-click-Ereignisse bedingt hinzufügen, ohne die deaktivierte Klasse zu verwenden.

HTML:

  <input ng-click="profileForm.$valid && updateMyProfile()" name="submit" id="submit" value="Save" class="submit" type="submit">
Rubi saini
quelle
Dies beantwortet die Frage, ich würde es einfach nicht als Best Practice bezeichnen. Aber auch hier beantwortet es die Frage perfekt. Ich denke, es sollte mit einer Aussage zurückgehalten werden, die erklärt, warum es eine schlechte Form ist. Aber man kann nicht sagen, dass er die eigentliche Frage nicht beantwortet hat.
Eric Bishard
0

Sie können Bedingungen in Tags einfügen. Versuchen:

ng-class="{true:'active',false:'disable'}[list_status=='show']"
Robert Johnstone
quelle
0

Schreiben Sie als

<input type="submit" ng-click="profileForm.$valid==true?updateMyProfile():''" name="submit" value="Save" class="submit" id="submit">
Pawan Kr
quelle