formとngModel
10928 ワード
リファレンス
https://docs.angularjs.org/api/ng/type/ngModel.NgModelController
https://docs.angularjs.org/api/ng/type/form.FormController
Angularはフォームコマンドを提供しており、ngModelとよく一緒に作業しているので、一緒に紹介します.
まず基本的なng-modelについて説明します
ng-model作用はdouble binding
ng-modelは異なるelement上で異なる同期モードがあり、これらのangularはすでに多くのパッケージを手伝ってくれた.
もちろんangularは、ngModelという命令のcontroller(ngModelという名前)においてもいくつかの方法を提供しており、自分のコントロール(e.g.:checkBox,dropDownList)でもdouble bindingを行うことができます.
さらにng-modelにはいくつかの基本的なoptionが設定できます(1.3ならでは)
updateOnは、blur/keyupなどのelemが更新されるイベント名を書き込む.
debounceはdeley updateミリ秒であり、一般的にkeydownに連絡するたびに更新されるのではなく、ユーザーが入力を停止するまで更新を実行することを望んでいません.delayを1つ置くことができます
getterSetter=trueは、$scopeなどの依存属性に使用できます.name = function (){ retrun xx; } nameがメソッドである場合
ng-model controllerにはどんな属性方法があるか見てみましょう
ngModel controller
$parsers、$formattersはデータブロック
ビューto scopeのたびに$parsersのすべてのメソッドがトリガーされます.検証や交換など、メソッドでデータを処理することができます.$formattersはscope to view時にトリガーされます
$viewChangeListeners公式サイトの説明は
Array of functions to execute whenever the view value has changed. 各view value changeトリガ
It is called with no arguments, and its return value is ignored.//no para , no return
This can be used in place of additional $watches against the model value.//使い道がよくわからない
$dirty、$validなどは、フォームと組み合わせて使用され、フォームはこの値の合計を統計します.
いくつかの方法があります.
「$render」、「$isEmpty」、「$setValidity」、//よく使われるのはこれで、para(検証命令、isValid)「$setPristine」、「$setView Value」
$renderと$setViewValueは私たちがコントロールをするときに必ずすごいです.
$renderはangularに呼び出される方法で、angularがページをレンダリングする方法を教えてくれます.
digestがscope value changedを発見すると、angularは$modelValueが$formattersを経て得た値を$viewValueに入れ、(このとき$viewValue=$modelValueが$formattersを経た)私たちが書いた$renderをトリガーします.
だから私たちは$renderの中で$viewValueを取得してdomに書きます.
$setView Valueは逆にangularが書いた方法で、私たちはそれを呼び出し、domがchangeやblurなどのイベントをトリガーしたとき、valueを取得し、私たちはこの$setView Valueを呼び出します.
最初のステップangularは$viewValue=newValueになり、$parsersで得られた値を$modelValueとscope valueに書き込む.
外伝:
余談ですが、フレームワークとライブラリの違い、ライブラリには他の人の方法がたくさんあります.私たちは書く過程を担当し、間でライブラリの方法を呼び出します.フレームワークは反対に、私たちは多くの方法を書いて、プロセスはフレームワークが定義されており、プロセスを実行するときに私たちが書いた方法を呼び出します.どこから见たか忘れて、これは私に多くのことを悟らせて、特に分かち合います).
$setValidityはフォームとの通信を検証するために使用されます.
ここでは、カスタム検証コマンドの例を示します.
ここではis-abc命令を作成し,ngModelをブロックし,検証手法を追加し,$setValidityを介してformに通知し,ここでは遅延検証手法も行った.
ng-form‖form指令
ng-formはformと同じで、controllerの名前はformです
formにはいくつかの規範があり、必ずnameが必要で、中のコントロールにもnameが必要で、ng-modelでコミュニケーションしたほうがいいです.angularは自動的にcontrollerを追加するなどのことをパッケージしているからです.
流れは大体こうですが、
form->model->検証命令
コマンドはmodelをブロックして検証するなど、modelでformに通知する
form controllerにはいくつかの属性があります
主にフォーム内のコントロールを収録したng-model controllerリファレンス
formでのメソッド
「$addControl」、//ngModel controllerを追加すると、ngModelは自動的に追加されます.カスタムコマンドが「$removeControl」、「$setValidity」、para(検証コマンド、isValid、ngModel controller)set ngModelのvalid「$setDirty」、no para、setプロパティ「$setPristine」no para、setプロパティ「$setPristine」no para、setプロパティ
angularが提供する方法を呼び出すと、form model parentなどを直列に接続します.
更新:2015-05-23
バージョン1.3以降はngModelの検証が簡単になりましたngModel.$asyncValidators or ngModel.Validatorsは検証方法を入力します.
ngModelがネストされている場合、命令がネストされる場合があり、ngModelもネストされる場合があります.直接このように書く人もいるかもしれません.
scope : {
ngModel : "="
}
表面的にはこれは問題ありません.angularは確かにこの値を同期させることができますが、このように書くと、親層の
正しい方法は、子レイヤで$renderと$setViewValueを使用して親レイヤのngModelを変更することです.
https://docs.angularjs.org/api/ng/type/ngModel.NgModelController
https://docs.angularjs.org/api/ng/type/form.FormController
Angularはフォームコマンドを提供しており、ngModelとよく一緒に作業しているので、一緒に紹介します.
まず基本的なng-modelについて説明します
ng-model作用はdouble binding
ng-modelは異なるelement上で異なる同期モードがあり、これらのangularはすでに多くのパッケージを手伝ってくれた.
もちろんangularは、ngModelという命令のcontroller(ngModelという名前)においてもいくつかの方法を提供しており、自分のコントロール(e.g.:checkBox,dropDownList)でもdouble bindingを行うことができます.
さらにng-modelにはいくつかの基本的なoptionが設定できます(1.3ならでは)
<input type="text" name="userName"
ng-model="user.name"
ng-model-options="{ updateOn: 'blur', debounce: 1000 ,getterSetter: true }"/><br />
<pre>user.name = <span ng-bind="user.name()"></span></pre>
updateOnは、blur/keyupなどのelemが更新されるイベント名を書き込む.
debounceはdeley updateミリ秒であり、一般的にkeydownに連絡するたびに更新されるのではなく、ユーザーが入力を停止するまで更新を実行することを望んでいません.delayを1つ置くことができます
getterSetter=trueは、$scopeなどの依存属性に使用できます.name = function (){ retrun xx; } nameがメソッドである場合
ng-model controllerにはどんな属性方法があるか見てみましょう
ngModel controller
var ngModelController = {
"$viewValue": "12", // "$modelValue": "12", //$scope value "$parsers": [null, null], // null json , function "$formatters": [null, null], "$viewChangeListeners": [null], "$pristine": false, "$dirty": true, "$valid": true, "$invalid": false, "$name": "name", "$error": { "required": false, // true error , valid fail "minlength": false }, "$$validityState": {} // }
$parsers、$formattersはデータブロック
ビューto scopeのたびに$parsersのすべてのメソッドがトリガーされます.検証や交換など、メソッドでデータを処理することができます.$formattersはscope to view時にトリガーされます
$viewChangeListeners公式サイトの説明は
Array of functions to execute whenever the view value has changed. 各view value changeトリガ
It is called with no arguments, and its return value is ignored.//no para , no return
This can be used in place of additional $watches against the model value.//使い道がよくわからない
$dirty、$validなどは、フォームと組み合わせて使用され、フォームはこの値の合計を統計します.
いくつかの方法があります.
「$render」、「$isEmpty」、「$setValidity」、//よく使われるのはこれで、para(検証命令、isValid)「$setPristine」、「$setView Value」
$renderと$setViewValueは私たちがコントロールをするときに必ずすごいです.
$renderはangularに呼び出される方法で、angularがページをレンダリングする方法を教えてくれます.
digestがscope value changedを発見すると、angularは$modelValueが$formattersを経て得た値を$viewValueに入れ、(このとき$viewValue=$modelValueが$formattersを経た)私たちが書いた$renderをトリガーします.
だから私たちは$renderの中で$viewValueを取得してdomに書きます.
$setView Valueは逆にangularが書いた方法で、私たちはそれを呼び出し、domがchangeやblurなどのイベントをトリガーしたとき、valueを取得し、私たちはこの$setView Valueを呼び出します.
最初のステップangularは$viewValue=newValueになり、$parsersで得られた値を$modelValueとscope valueに書き込む.
外伝:
余談ですが、フレームワークとライブラリの違い、ライブラリには他の人の方法がたくさんあります.私たちは書く過程を担当し、間でライブラリの方法を呼び出します.フレームワークは反対に、私たちは多くの方法を書いて、プロセスはフレームワークが定義されており、プロセスを実行するときに私たちが書いた方法を呼び出します.どこから见たか忘れて、これは私に多くのことを悟らせて、特に分かち合います).
$setValidityはフォームとの通信を検証するために使用されます.
ここでは、カスタム検証コマンドの例を示します.
<div ng-app="app" ng-controller="email">
<div ng-form="emailForm">
<input type="text" name="email" ng-model="email" is-abc />
<span ng-click="see()">{{ emailForm.$valid }}</span>
</div>
</div>
angular.module("app", []).
directive("isAbc", ["$timeout", function ($timeout) {
return {
restrict: "A",
require: "ngModel",
link: function ($scope, $element, $attrs, $ctrl) {
var validator = function (v) {
$timeout.cancel($ctrl.timeout);
$ctrl.timeout = $timeout(function () {
if (v == "abc") {
$ctrl.$setValidity('isAbc', true);
return v;
} else {
$ctrl.$setValidity('isAbc', false);
return undefined;
}
}, 2000);
}
$ctrl.$parsers.push(validator);
}
}
}]);
ここではis-abc命令を作成し,ngModelをブロックし,検証手法を追加し,$setValidityを介してformに通知し,ここでは遅延検証手法も行った.
ng-form‖form指令
ng-formはformと同じで、controllerの名前はformです
<div ng-app="app" ng-controller="email">
<form name="emailForm">
<input type="text" name="email" ng-model="email" required />
<input type="text" name="name" ng-model="email" required ng-minlength="2" />
<span ng-click="see()">{{ emailForm.$valid }}</span>
</form>
</div>
formにはいくつかの規範があり、必ずnameが必要で、中のコントロールにもnameが必要で、ng-modelでコミュニケーションしたほうがいいです.angularは自動的にcontrollerを追加するなどのことをパッケージしているからです.
流れは大体こうですが、
form->model->検証命令
コマンドはmodelをブロックして検証するなど、modelでformに通知する
form controllerにはいくつかの属性があります
var formController = {
"$name": "emailForm",
"$dirty": false, //form
"$pristine": true, //form
"$valid": false, // pass
"$invalid": true, // fail
"email": {}, //key form nama,value ngModel controller ,
"$error": {"required" : []} //key error ,value , invalid ngModel controller
}
主にフォーム内のコントロールを収録したng-model controllerリファレンス
formでのメソッド
「$addControl」、//ngModel controllerを追加すると、ngModelは自動的に追加されます.カスタムコマンドが「$removeControl」、「$setValidity」、para(検証コマンド、isValid、ngModel controller)set ngModelのvalid「$setDirty」、no para、setプロパティ「$setPristine」no para、setプロパティ「$setPristine」no para、setプロパティ
angularが提供する方法を呼び出すと、form model parentなどを直列に接続します.
更新:2015-05-23
バージョン1.3以降はngModelの検証が簡単になりましたngModel.$asyncValidators or ngModel.Validatorsは検証方法を入力します.
ngModelがネストされている場合、命令がネストされる場合があり、ngModelもネストされる場合があります.直接このように書く人もいるかもしれません.
scope : {
ngModel : "="
}
表面的にはこれは問題ありません.angularは確かにこの値を同期させることができますが、このように書くと、親層の
$parsers 。
です.正しい方法は、子レイヤで$renderと$setViewValueを使用して親レイヤのngModelを変更することです.