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

92

Verwenden des TokenInput- Plugins und der in AngularJS integrierten formController-Validierung.

Im Moment versuche ich zu überprüfen, ob das Feld Text enthält, und setze das Feld dann auf gültig, wenn dies der Fall ist. Das Problem bei der Verwendung des Plugins ist, dass es eine eigene Eingabe und dann eine ul + li zum Festhalten erstellt.

Ich habe Zugriff auf addItem (Formularname) und meine Funktionen im Controller. Ich muss es nur auf $ valid setzen.

Markup.

<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 und in das Objekt übergeben hat.

BEARBEITEN:

Ich habe herausgefunden, dass ng-model in meiner Eingabe Dinge tut und die Ergebnisse der automatischen Vervollständigung erhält, weshalb ich ng-valid nicht zum Arbeiten 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, wenn ich Zugriff auf das ng-model attr hätte und die Modellfunktion an einen anderen Ort verschieben würde?

Christopher Marshall
quelle
1
Da Ihr Plugin eine eigene Eingabe erstellt und Sie eine Funktion für Ihre eigene Validierung geschrieben haben, können Sie auch Ihre eigene $ scope-Eigenschaft für die Validierung verwenden: <div ... data-ng-show="capabilities_error" ...> Mit anderen Worten, gibt es einen Grund, warum Sie FormController verwenden möchten / müssen?
Mark Rajcok
2
Da alle meine anderen Formulare es verwenden, möchte ich die Kontrolle behalten, die es gibt. Die vom Plugin erstellte Eingabe legt tatsächlich den Wert in meiner ursprünglichen Eingabe fest, den ich dann bei meiner Validierung überprüfen muss, aktualisiert jedoch nicht den formController, wenn ein eingegebener Wert vorhanden ist.
Christopher Marshall
Ich habe das Markup absichtlich gekürzt, um die Eingabe zu isolieren. Ich habe eine Menge mehr Eingaben in der gleichen Form.
Christopher Marshall
1
In Ordnung. Haben Sie versucht addItem.capabilities.$valid = true, addItem.capabilities. $ Error.required auf true oder false zu setzen?
Mark Rajcok
Ich habe beide ausprobiert. Ich werde meine Frage aktualisieren, um es Ihnen zu zeigen. $ Valid und $ error.required werden auf meinem Haltepunkt im Controller als undefiniert angezeigt, aber addItem.capabilities enthält weiterhin Daten.
Christopher Marshall

Antworten:

150

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, ist dies nicht der Fall.

Sie sollten die Gültigkeit des Eingabeelements festlegen. Wie so;

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

Jetzt ist die Eingabe (und damit das Formular) ungültig. Sie können auch sehen, welcher Fehler die Ungültigmachung verursacht.

addItem.capabilities.errors.youAreFat == true;
Umur Kontacı
quelle
1
Was ist, wenn capabilitieses sich um eine Variable handelt? Ich habe ein Array, das Eingabenamen enthält, und ich möchte eine Schleife innerhalb des Arrays
erstellen
1
Was meinst du mit Variable? Es ist direkt an das Formular selbst gebunden, nicht an die Werte im Formular. Es verwendet das nameAttribut des Formulars und das Attribut der Eingabe id. Dies unterscheidet sich von den Werten vonngModel
Umur Kontacı
11
Ich habe die Lösung gefunden, aber das habe ich gemeint:$scope.addItem['myVariableName'].$setValidity("youAreFat", false);
Lightalex
Danach scheinen einige Eingabefelder bei Änderung oder Unschärfe nicht mehr validiert zu sein
Leonardo
4
Auf Winkel 1.4.7 und ich musste diesem Code $ scope voranstellen ..$scope.addItem.capabilities.$setValidity("youAreFat", false);
Graham T
60

Die obigen Antworten haben mir nicht geholfen, mein Problem zu lösen. Nach langer Suche bin ich auf diese Teillösung gestoßen .

Ich habe endlich mein Problem mit diesem Code gelöst, um das Eingabefeld manuell auf ng-invalid zu setzen (um es auf ng-valid zu setzen, setzen Sie es auf 'true'):

$scope.myForm.inputName.$setValidity('required', false);
notMyName
quelle
3
Ich habe das gleiche getan und es funktioniert großartig. Aber jetzt habe ich einige Probleme, das gleiche Feld erneut zu validieren. Es ändert sich nicht in den geänderten Zustand, was sehr ärgerlich ist. Ich verwende ng-model-options = "{updateOn: 'submit'}", um beim Klicken auf eine Schaltfläche zu validieren. Irgendwelche Gedanken dazu?
OliverKK
1
@OliverKK müssen Sie aufrufen $setValiditymit trueals zweiten Parameter , wenn die Eingabe gültig ist.
Bernhard Hofmann
10
macht keinen Sinn, Rootscope zu verwenden, sollte nur Umfang sein
Ryan M
1
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) den ungültigen Wert festlege, kann ich diesen ungültigen Status nicht entfernen.
Naomi
18

Ich bin auf diesen Beitrag mit einem ähnlichen Problem gestoßen. Mein Fix 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 nullbaren Bool, bei 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 ungü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>
James Fleming
quelle
1

Es ist sehr einfach. 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;

Alles funktioniert für mich für unterschiedliche Anforderungen. Schlagen Sie zu, wenn dies Ihr Problem löst.

rahim.nagori
quelle