La via angolare
Il modo angolare corretto per farlo è scrivere un'app a pagina singola, AJAX nel modello di modulo, quindi popolarla dinamicamente dal modello. Il modello non è popolato dal modulo per impostazione predefinita perché il modello è la singola fonte di verità. Invece Angular andrà dall'altra parte e proverà a popolare il modulo dal modello.
Se tuttavia, non hai tempo di ricominciare da capo
Se hai un'app scritta, ciò potrebbe comportare alcune modifiche architettoniche piuttosto pesanti. Se stai cercando di utilizzare Angular per migliorare un modulo esistente, piuttosto che costruire un'intera app per pagina singola da zero, puoi estrarre il valore dal modulo e memorizzarlo nell'ambito al momento del collegamento usando una direttiva. Angular assocerà quindi il valore nell'ambito nell'ambito al modulo e lo manterrà sincronizzato.
Usando una direttiva
È possibile utilizzare una direttiva relativamente semplice per estrarre il valore dal modulo e caricarlo nell'ambito corrente. Qui ho definito una direttiva 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);
}
};
});
Puoi vedere che ho definito un paio di fallback per ottenere il nome di un modello. È possibile utilizzare questa direttiva insieme alla direttiva ngModel o legare a qualcosa di diverso da $ scope se si preferisce.
Usalo in questo modo:
<input name="test" ng-model="toaster.test" value="hello" init-from-form />
{{toaster.test}}
Nota che funzionerà anche con textareas e seleziona i menu a discesa.
<textarea name="test" ng-model="toaster.test" init-from-form>hello</textarea>
{{toaster.test}}