角度のある方法
これを行う正しいAngularの方法は、フォームテンプレートにシングルページアプリAJAXを記述し、モデルから動的に入力することです。モデルは信頼できる唯一の情報源であるため、デフォルトではモデルはフォームから入力されません。代わりに、Angularは逆の方向に進み、モデルからフォームにデータを入力しようとします。
ただし、最初からやり直す時間がない場合
アプリを作成している場合、これにはかなり大きなアーキテクチャの変更が含まれる可能性があります。シングルページアプリ全体を最初から作成するのではなく、Angularを使用して既存のフォームを拡張しようとしている場合は、フォームから値を取得し、ディレクティブを使用してリンク時にスコープに保存できます。その後、Angularはスコープ内の値をフォームにバインドし、同期を維持します。
ディレクティブの使用
比較的単純なディレクティブを使用して、フォームから値をプルし、それを現在のスコープにロードできます。ここでは、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);
}
};
});
モデル名を取得するために、いくつかのフォールバックを定義したことがわかります。このディレクティブをngModelディレクティブと組み合わせて使用するか、必要に応じて$scope以外のものにバインドできます。
次のように使用します。
<input name="test" ng-model="toaster.test" value="hello" init-from-form />
{{toaster.test}}
これはtextareasでも機能し、ドロップダウンを選択することに注意してください。
<textarea name="test" ng-model="toaster.test" init-from-form>hello</textarea>
{{toaster.test}}