Der eckige Weg
Die richtige Methode für Angular besteht darin, eine einzelne Seiten-App, AJAX, in die Formularvorlage zu schreiben und sie dann dynamisch aus dem Modell zu füllen. Das Modell wird standardmäßig nicht aus dem Formular ausgefüllt, da das Modell die einzige Quelle der Wahrheit ist. Stattdessen geht Angular in die andere Richtung und versucht, das Formular aus dem Modell zu füllen.
Wenn Sie jedoch keine Zeit haben, von vorne zu beginnen
Wenn Sie eine App geschrieben haben, kann dies zu erheblichen architektonischen Änderungen führen. Wenn Sie versuchen, Angular zu verwenden, um ein vorhandenes Formular zu verbessern, anstatt eine einzelne App für eine einzelne Seite von Grund auf neu zu erstellen, können Sie den Wert aus dem Formular abrufen und mithilfe einer Direktive zum Zeitpunkt der Verknüpfung im Bereich speichern. Angular bindet dann den Wert im Bereich wieder an das Formular und hält ihn synchron.
Verwendung einer Direktive
Sie können eine relativ einfache Anweisung verwenden, um den Wert aus dem Formular abzurufen und in den aktuellen Bereich zu laden. Hier habe ich eine initFromForm-Direktive definiert.
var myApp = angular.module("myApp", ['initFromForm']);
angular.module('initFromForm', [])
.directive("initFromForm", function ($parse) {
return {
link: function (scope, element, attrs) {
var attr = attrs.initFromForm || attrs.ngModel || element.attrs('name'),
val = attrs.value;
if (attrs.type === "number") {val = parseInt(val)}
$parse(attr).assign(scope, val);
}
};
});
Sie können sehen, dass ich einige Fallbacks definiert habe, um einen Modellnamen zu erhalten. Sie können diese Direktive in Verbindung mit der ngModel-Direktive verwenden oder an etwas anderes als $ scope binden, wenn Sie dies bevorzugen.
Verwenden Sie es so:
<input name="test" ng-model="toaster.test" value="hello" init-from-form />
{{toaster.test}}
Beachten Sie, dass dies auch mit Textbereichen funktioniert, und wählen Sie Dropdowns aus.
<textarea name="test" ng-model="toaster.test" init-from-form>hello</textarea>
{{toaster.test}}