Ich habe ein AngularJS-Formular, das unter anderem einen Typ url
enthält. Letzteres ist wichtig, da dies dazu führt, dass die entsprechende Eingabe eine gültige URL ist.Wie wird das Formular ordnungsgemäß mit ungültigen Eingaben vom AngularJS-Controller bereinigt?
Unter bestimmten Bedingungen (zum Beispiel ein modales Dialogfeld mit einem solchen Formular geschlossen werden soll), möchte ich dieses Formular programmgesteuert löschen. Zu diesem Zweck habe ich die Methode reset
implementiert, die im Grunde das entsprechende Formularmodell löscht, indem $scope.formData = {}
gesetzt wird. Daher wird das Formularmodell auf ein neues, leeres Objekt festgelegt.
Während die Zuweisung löscht alle gültig Felder im HTML-Formular gemacht, es tut nicht klar ungültig Felder, wie eine ungültige URL. Wenn der Benutzer beispielsweise die ungültige Eingabe ht://t/p
als URL angibt, wird diese Eingabe nicht aus dem gerenderten Formular entfernt.
Ich denke, dies liegt an der Tatsache, dass eine ungültige URL nicht durch das Modell widergespiegelt wird - solch eine ungültige URL würde es nicht zum Modell "machen", weil es die Validierung im Array NgModelController#$parsers
nicht besteht. Im Modell gibt es also überhaupt keine URL. Das Zurücksetzen des Formularmodells auf {}
kann daher die URL des Modells tatsächlich nicht ändern, da es noch nicht festgelegt worden ist.
Wenn jedoch die Methode reset
das Feld $scope.formData.url = ""
explizit festlegt, wird die ungültige URL ordnungsgemäß gelöscht (zumindest wird das gerenderte Formular nicht mehr angezeigt). Dies wird durch die explizite Änderung der URL im Modell verursacht. Jetzt enthält die Modellvariable formData.url
die leere Zeichenfolge (nun, nicht überraschend), während bei Verwendung von = {}
alle Felder stattdessen undefined
sind.
Während die Zuordnung einzelner Felder zu ""
als Workaround für einfache Formulare dient, wird es für komplexere Formulare mit vielen Feldern schnell umständlich.
Also, wie könnte ich das Formular programmatisch effizient und effektiv zurücksetzen - einschließlich aller ungültigen Eingabefelder?
Ich habe einen Plunker bei http://plnkr.co/c2Yhzs erstellt, wo Sie ein komplettes Beispiel untersuchen und ausführen können, das den obigen Effekt zeigt.
Die Idee des „saubere“ Form bedeutet nach einer Aktion aufrufen - Formular zurückzukehren dem Anfangszustand versetzt (aka wie für Seite neu laden). In Ihrem Fall '$ scope.formData = {}' –
@MaximShoustin möchte ich sowohl das Modell als auch die Ansicht zurücksetzen. Mit '$ scope.formData = {}' wird nur das _model_ zurückgesetzt. – Martin
Irgendwelche Fortschritte dabei? Ich habe mich auch gebissen. –