AngularJS: Wie setze ich die Eingabe im Controller manuell auf $valid?
Lesezeit: 6 Minuten
Christoph Marshall
Verwendung der TokenInput Plugin und die Verwendung der integrierten formController-Validierung von AngularJS.
Im Moment versuche ich zu überprüfen, ob das Feld Text enthält, und dann das Feld auf gültig zu setzen, wenn dies der Fall ist. Das Problem bei der Verwendung des Plugins ist, dass es seine eigene Eingabe und dann ein ul+li zum Stlying erstellt.
Ich habe Zugriff auf addItem (formname) und meine Fähigkeiten im Controller, ich muss es nur auf $valid setzen.
Ich führe die CapabilityValidation-Funktion aus, wenn TokenInput etwas eingegeben hat und das Objekt übergibt.
BEARBEITEN:
Ich habe herausgefunden, dass ng-model bei meiner Eingabe Dinge tut und die Ergebnisse der automatischen Vervollständigung erhält, weshalb ich ng-valid nicht zum Laufen bringen kann, da es auf dem Modell basiert.
Ich habe diese Autocomplete-Implementierung nicht geschrieben. Gibt es eine andere Möglichkeit, dies zu tun, bei der ich Zugriff auf das ng-model-Attribut hätte und die Modellfunktion an eine andere Stelle verschieben würde?
Da Ihr Plugin seine eigene Eingabe erstellt und Sie eine Funktion schreiben müssen, um Ihre eigene Validierung durchzuführen, warum verwenden Sie nicht einfach auch Ihre eigene $scope-Eigenschaft für die Validierung: <div ... data-ng-show="capabilities_error" ...> Mit anderen Worten, gibt es einen Grund, warum Sie FormController verwenden möchten/müssen?
– Markus Rajcok
15. März 2013 um 16:36 Uhr
Da alle meine anderen Formulare es verwenden, möchte ich die Kontrolle behalten, die es gibt. Die vom Plugin erstellte Eingabe setzt tatsächlich den Wert in meiner ursprünglichen Eingabe, den ich dann in meiner Validierung überprüfen muss, aber es aktualisiert den formController nicht, wenn ein eingegebener Wert vorhanden ist.
– Christoph Marshall
15. März 2013 um 16:39 Uhr
Ich habe das Markup absichtlich gekürzt, um die Eingabe zu isolieren. Ich habe eine Reihe weiterer Eingaben in derselben Form.
– Christoph Marshall
15. März 2013 um 16:39 Uhr
Okay. Hast du versucht addItem.capabilities.$valid = true und/oder addItem.capabilities.$error.required je nach Bedarf auf true oder false setzen?
– Markus Rajcok
15. März 2013 um 16:44 Uhr
Ich habe beides ausprobiert. Ich werde meine Frage aktualisieren, um es Ihnen zu zeigen. Die $valid und $error.required werden an meinem Haltepunkt im Controller als undefiniert angezeigt, aber addItem.capabilities enthält noch Daten.
– Christoph Marshall
15. März 2013 um 17:27 Uhr
Umur Kontaci
Sie können die Gültigkeit eines Formulars nicht direkt ändern. Wenn alle untergeordneten Eingaben gültig sind, ist das Formular gültig, wenn nicht, dann nicht.
Was Sie tun sollten, ist die Gültigkeit des Eingabeelements festzulegen. So;
Jetzt ist die Eingabe (und damit das Formular) ungültig. Sie können auch sehen, welcher Fehler zur Invalidierung führt.
addItem.capabilities.errors.youAreFat == true;
Was wäre wenn capabilities ist eine Variable? Ich habe ein Array, das Eingabenamen enthält, und ich möchte innerhalb des Arrays eine Schleife ausführen und sie einzeln ungültig machen: /
– Lichtalex
25. Juli 2014 um 7:31 Uhr
Was meinst du mit Variable? Es ist direkt an das Formular selbst gebunden, nicht an die Werte im Formular. Es verwendet Formulare name Attribute und Eingaben id Attribut. Dies unterscheidet sich von den durch eingestellten Werten ngModel
– Umur Kontaci
25. Juli 2014 um 19:15 Uhr
Ich habe die Lösung gefunden, aber das war, was ich meinte: $scope.addItem['myVariableName'].$setValidity("youAreFat", false);
– Lichtalex
28. Juli 2014 um 6:07 Uhr
Danach scheint es, dass einige Eingabefelder nicht mehr auf Änderung oder Unschärfe validiert werden
– Leonardo
20. November 2015 um 17:04 Uhr
Auf Angle 1.4.7 musste ich diesem Code $scope voranstellen. $scope.addItem.capabilities.$setValidity("youAreFat", false);
– Graham T
3. Februar 2016 um 16:07 Uhr
nichtMeinName
Die obigen Antworten haben mir nicht geholfen, mein Problem zu lösen. Nach langer Suche bin ich auf diese gestoßen Teillösung.
Ich habe mein Problem endlich mit diesem Code gelöst, um das Eingabefeld manuell auf ng-invalid zu setzen (um es auf ng-valid zu setzen, setze es auf ‘true’):
Ich habe das gleiche gemacht und es funktioniert super. Aber jetzt habe ich einige Probleme, dasselbe Feld erneut zu validieren. Es wechselt nicht in den geänderten Zustand, was sehr ärgerlich ist. Ich verwende ng-model-options=”{ updateOn: ‘submit’ }”, um den Klick auf eine Schaltfläche zu validieren. Irgendwelche Gedanken dazu?
– OliverKK
10. September 2014 um 12:11 Uhr
@OliverKK müssen Sie aufrufen $setValidity mit true als zweiter Parameter, wenn die Eingabe gültig ist.
– Bernhard Hofmann
25. August 2015 um 14:26 Uhr
macht keinen Sinn, rootscope zu verwenden, sollte nur Bereich sein
–Ryan M
6. Juni 2016 um 18:49 Uhr
Ich habe eine ähnliche Lösung versucht, aber das Problem, das ich gefunden habe, ist, dass, wenn ich dann versuche, den Wert des Steuerelements im Formular zu ändern, es ungültig bleibt. In meinem Fall ist diese Steuerung eine Direktive mit der inneren Auswahl. Wenn ich für meine Direktive (die ng-form ist) das ungültige setze, kann ich diesen ungültigen Status nicht entfernen.
– Naomi
12. Juli 2018 um 21:53 Uhr
Jakob Fleming
Ich bin auf diesen Beitrag mit einem ähnlichen Problem gestoßen. Meine Lösung bestand darin, ein verstecktes Feld hinzuzufügen, um meinen ungültigen Status für mich zu speichern.
In meinem Fall hatte ich einen nullable bool, mit dem eine Person eine von zwei verschiedenen Schaltflächen auswählen musste. Wenn sie mit Ja antworten, wird der Sammlung eine Entität hinzugefügt und der Status der Schaltfläche ändert sich. Bis alle Fragen beantwortet sind (eine der Schaltflächen in jedem der Paare hat einen Klick), ist das Formular nicht gültig.
Danke – fühlt sich hacky an, aber genau das, was ich erwartet hatte 🙂
– Adam Hughes
Vor 17 Stunden
Es ist sehr einfach. Zum Beispiel: Verwenden Sie in Ihrem JS-Controller Folgendes:
$scope.inputngmodel.$valid = false;
oder
$scope.inputngmodel.$invalid = true;
oder
$scope.formname.inputngmodel.$valid = false;
oder
$scope.formname.inputngmodel.$invalid = true;
Alle Arbeiten für mich für unterschiedliche Anforderung. Schlagen Sie zu, wenn dies Ihr Problem löst.
Damit dies bei einem Datumsfehler funktioniert, musste ich den Fehler zuerst löschen, bevor ich $setValidity aufrief, damit das Formular als gültig markiert wurde.
Da Ihr Plugin seine eigene Eingabe erstellt und Sie eine Funktion schreiben müssen, um Ihre eigene Validierung durchzuführen, warum verwenden Sie nicht einfach auch Ihre eigene $scope-Eigenschaft für die Validierung:
<div ... data-ng-show="capabilities_error" ...>
Mit anderen Worten, gibt es einen Grund, warum Sie FormController verwenden möchten/müssen?– Markus Rajcok
15. März 2013 um 16:36 Uhr
Da alle meine anderen Formulare es verwenden, möchte ich die Kontrolle behalten, die es gibt. Die vom Plugin erstellte Eingabe setzt tatsächlich den Wert in meiner ursprünglichen Eingabe, den ich dann in meiner Validierung überprüfen muss, aber es aktualisiert den formController nicht, wenn ein eingegebener Wert vorhanden ist.
– Christoph Marshall
15. März 2013 um 16:39 Uhr
Ich habe das Markup absichtlich gekürzt, um die Eingabe zu isolieren. Ich habe eine Reihe weiterer Eingaben in derselben Form.
– Christoph Marshall
15. März 2013 um 16:39 Uhr
Okay. Hast du versucht
addItem.capabilities.$valid = true
und/oder addItem.capabilities.$error.required je nach Bedarf auf true oder false setzen?– Markus Rajcok
15. März 2013 um 16:44 Uhr
Ich habe beides ausprobiert. Ich werde meine Frage aktualisieren, um es Ihnen zu zeigen. Die $valid und $error.required werden an meinem Haltepunkt im Controller als undefiniert angezeigt, aber addItem.capabilities enthält noch Daten.
– Christoph Marshall
15. März 2013 um 17:27 Uhr