La voie angulaire
La manière angulaire correcte de le faire est d'écrire une application d'une seule page, AJAX dans le modèle de formulaire, puis de la remplir dynamiquement à partir du modèle. Le modèle n'est pas renseigné par défaut à partir du formulaire car le modèle est la seule source de vérité. Au lieu de cela, Angular ira dans l'autre sens et essaiera de remplir le formulaire à partir du modèle.
Si toutefois vous n'avez pas le temps de recommencer à zéro
Si vous avez une application écrite, cela peut impliquer des changements architecturaux assez lourds. Si vous essayez d'utiliser Angular pour améliorer un formulaire existant, plutôt que de créer une application entière d'une seule page à partir de zéro, vous pouvez extraire la valeur du formulaire et la stocker dans la portée au moment du lien à l'aide d'une directive. Angular liera ensuite la valeur de l'étendue au formulaire et la gardera synchronisée.
Utilisation d'une directive
Vous pouvez utiliser une directive relativement simple pour extraire la valeur du formulaire et la charger dans la portée actuelle. Ici, j'ai défini une directive initFromForm.
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);
}
};
});
Vous pouvez voir que j'ai défini quelques solutions de rechange pour obtenir un nom de modèle. Vous pouvez utiliser cette directive en conjonction avec la directive ngModel, ou vous lier à autre chose que $ scope si vous préférez.
Utilisez-le comme ceci:
<input name="test" ng-model="toaster.test" value="hello" init-from-form />
{{toaster.test}}
Notez que cela fonctionnera également avec les zones de texte et sélectionnez des listes déroulantes.
<textarea name="test" ng-model="toaster.test" init-from-form>hello</textarea>
{{toaster.test}}