AngularJS: Wie setze ich die Eingabe im Controller manuell auf $valid?

Lesezeit: 6 Minuten

Benutzer-Avatar
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.

Markierung.

<form class="form-horizontal add-inventory-item" name="addItem">
     <input id="capabilities" name="capabilities" token-input data-ng-model="inventoryCapabilitiesAutoComplete" data-on-add="addCapability()" data-on-delete="removeCapability()" required>
     <div class="required" data-ng-show="addItem.capabilities.$error.required" title="Please enter capability."></div>
</form>

JS.

$scope.capabilityValidation = function (capability) {
  if (capability.name !== "") {
    addItem.capabilities.$valid = true;
    addItem.capabilities.$error.required = false;
  } else {
    addItem.capabilities.$valid = false;
    addItem.capabilities.$error.required = true;
  }
};

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.

$scope.inventoryCapabilitiesAutoComplete = {
  options: {
    tokenLimit: null
  },
  source: urlHelper.getAutoComplete('capability')
};

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

Benutzer-Avatar
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;

addItem.capabilities.$setValidity("youAreFat", false);

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

Benutzer-Avatar
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’):

$scope.myForm.inputName.$setValidity('required', false);

  • 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

Benutzer-Avatar
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.

<input type="hidden" ng-model="vm.application.isValid" required="" />

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.

vm.hasHighSchool = function (attended) { 
  vm.application.hasHighSchool = attended;
  applicationSvc.addSchool(attended, 1, vm.application);
}
<input type="hidden" ng-model="vm.application.hasHighSchool" required="" />
<div class="row">
  <div class="col-lg-3"><label>Did You Attend High School?</label><label class="required" ng-hide="vm.application.hasHighSchool != undefined">*</label></div>
  <div class="col-lg-2">
    <button value="Yes" title="Yes" ng-click="vm.hasHighSchool(true)" class="btn btn-default" ng-class="{'btn-success': vm.application.hasHighSchool == true}">Yes</button>
    <button value="No" title="No" ng-click="vm.hasHighSchool(false)" class="btn btn-default" ng-class="{'btn-success':  vm.application.hasHighSchool == false}">No</button>
  </div>
</div>

  • 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.

delete currentmodal.form.$error.date;
currentmodal.form.$setValidity('myDate', true);

1179190cookie-checkAngularJS: Wie setze ich die Eingabe im Controller manuell auf $valid?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy