AnglarJs双方向バインディングの原理(データーバインディングのメカニズム)を簡単に話します。
じゃ、双方向バインディングとは何ですか?簡単に説明します。
まず私たちはデータバインディングを理解しなければならない。私たちが見たウェブサイトのページは、データとデザインの二つの部分から構成されています。ブラウザで理解できる言語にデザインを変換するということは、htmlとcssの主な仕事です。データをページに表示し、ユーザーの操作や対応するページ反応などの一定のインタラクティブ効果があるということは、jsが主に完成した仕事である。データを更新するたびにページを更新することはできません。バックエンドに関連データを要求し、更新なしでページを更新することが多いです。データを更新すると、ページ上の該当の位置にも自動的に対応する修正ができます。データバインディングです。
以前の開発モードでは、このステップは一般的にjqによってDOM構造を操作して、ページを更新する。しかし、このように大量のコードと大量の操作がもたらされます。開始時に、バックエンドから取得したデータからページ上に必要な操作が確定されています。データが変更されると、ページの関連内容が自動的に変化します。これによって、フロントエンドエンジニアの開発が大幅に便利になります。新しいフレームの中で、データを監視することによって、変化がすでに書かれている規則に基づいてページを修正することを発見し、データバインディングを実現しました。データバインディングはM(model,データ)がVM(model-view,データとページの間の変換規則)を介してV(view)に修正されることが分かる。
双方向結合は逆方向の道を増やすことである。ユーザーがページを操作する(例えば、Inputに値を入力する)場合、データは速やかに変化し、データの変化に応じて、ページの別のところでも対応するように修正されます。よくある例として、タオバオの中のショッピングカートは商品の数が変わった時、商品の価格もすぐに変わります。これによりV―M―VM―Vの双方向結合が実現された。
AnglarJsはscopeモデルのためにモニターキューを設置し、データの変化をモニターしてviewを更新します。一つのものをviewに結びつけるたびに、AnglarJsはドルウォッチの列にドルウォッチを挿入して、監視しているmodelに変化があるかどうかを確認します。ブラウザがangglar contextで処理できるイベントを受信すると、digestループがトリガされます。digestはすべての$watchを巡回します。したがって、DOMを更新する。
$ウォッチ
これは私たちの観察者モードと似ています。現在のスコープの下で、監視カメラを作成します。ウォッチとモニタを作成します。
controller.js
$digest
ブラウザがangglar contextで処理できるイベントを受信すると、digestループがトリガされます。digestは私たちの$watchを遍歴します。もし変化がないなら、この循環検査は停止します。少なくとも一つの更新があれば、このサイクルは再び触発されます。このようにして、各モデルはもう変化しないと保証できます。これが汚れ検査の仕組みです。
controller.jsボタンを押すと です。ブラウザはイベントを受信して、angglar contextに入ります。 ドルdigestサイクルは実行を開始し、各$watchが変化するかどうかを調べる。 $scope.nameのウォッチのために変更が報告されました。これは強制的にもう一度$digestサイクルを実行します。 の新しい$digestサイクルは変化を検出していません。 は、$scope.nameの新しい値に対応する部分のDOMを更新する。 $appy
apply UIの更新に直接理解できます。もしイベントがトリガされたら、Anglar contextに入ります。呼び出しがないと入れません。その後のdigest検出メカニズムは起動しません。
$apply()メソッドの2つの形態
1)無参
2)有参
AnglarJSでは$ウォッチを使用します。
よく使う使い方:
傍受する対象が対象である場合は、3番目のパラメータが必要です。
締め括りをつける
1)ページには$scope変数だけが結びつけられています。
2)$appyはイベントがangglar contextに入るかどうかを決定します。
3)$digest循環検査modelは最低2回、最大10回(10回以上の例外を投げて、無限検査を防止する)
4)AnglarJsが持っている命令はすでに$applyを実現しました。ですから、私達が追加で作成する必要はありません。
5)カスタムコマンドの場合は、functionパラメータ付きのapplyを推奨します。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
まず私たちはデータバインディングを理解しなければならない。私たちが見たウェブサイトのページは、データとデザインの二つの部分から構成されています。ブラウザで理解できる言語にデザインを変換するということは、htmlとcssの主な仕事です。データをページに表示し、ユーザーの操作や対応するページ反応などの一定のインタラクティブ効果があるということは、jsが主に完成した仕事である。データを更新するたびにページを更新することはできません。バックエンドに関連データを要求し、更新なしでページを更新することが多いです。データを更新すると、ページ上の該当の位置にも自動的に対応する修正ができます。データバインディングです。
以前の開発モードでは、このステップは一般的にjqによってDOM構造を操作して、ページを更新する。しかし、このように大量のコードと大量の操作がもたらされます。開始時に、バックエンドから取得したデータからページ上に必要な操作が確定されています。データが変更されると、ページの関連内容が自動的に変化します。これによって、フロントエンドエンジニアの開発が大幅に便利になります。新しいフレームの中で、データを監視することによって、変化がすでに書かれている規則に基づいてページを修正することを発見し、データバインディングを実現しました。データバインディングはM(model,データ)がVM(model-view,データとページの間の変換規則)を介してV(view)に修正されることが分かる。
双方向結合は逆方向の道を増やすことである。ユーザーがページを操作する(例えば、Inputに値を入力する)場合、データは速やかに変化し、データの変化に応じて、ページの別のところでも対応するように修正されます。よくある例として、タオバオの中のショッピングカートは商品の数が変わった時、商品の価格もすぐに変わります。これによりV―M―VM―Vの双方向結合が実現された。
AnglarJsはscopeモデルのためにモニターキューを設置し、データの変化をモニターしてviewを更新します。一つのものをviewに結びつけるたびに、AnglarJsはドルウォッチの列にドルウォッチを挿入して、監視しているmodelに変化があるかどうかを確認します。ブラウザがangglar contextで処理できるイベントを受信すると、digestループがトリガされます。digestはすべての$watchを巡回します。したがって、DOMを更新する。
$ウォッチ
これは私たちの観察者モードと似ています。現在のスコープの下で、監視カメラを作成します。ウォッチとモニタを作成します。
controller.js
app.controller('MainCtrl', function($scope) {
$scope.Hello = "Hello";
$scope.world = "World";
});
index.
<div>{{Hello}}</div>
ここで、私たちは2つの変数をscopeに追加しても、UIに一つだけ結合されていますので、ここでは一つのwatchしか生成されません。$digest
ブラウザがangglar contextで処理できるイベントを受信すると、digestループがトリガされます。digestは私たちの$watchを遍歴します。もし変化がないなら、この循環検査は停止します。少なくとも一つの更新があれば、このサイクルは再び触発されます。このようにして、各モデルはもう変化しないと保証できます。これが汚れ検査の仕組みです。
controller.js
app.controller('MainCtrl', function() {
$scope.name = "Foo";
$scope.changeFoo = function() {
$scope.name = "Bar";
}
});
index.js
<div>{{ name }}</div>
<button ng-click="changeFoo()">Change the name</button>
apply UIの更新に直接理解できます。もしイベントがトリガされたら、Anglar contextに入ります。呼び出しがないと入れません。その後のdigest検出メカニズムは起動しません。
app.directive('clickable', function() {
return {
restrict: "E",
scope: {
foo: '='
},
template: '<ul style="background-color: lightblue"><li>{{foo}}</li></ul>',
link: function(scope, element, attrs) {
element.bind('click', function() {
scope.foo++;
console.log(scope.foo);
});
}
}
});
私たちがclickableコマンドを呼び出すと、fooの値が増加していますが、画面に表示されている内容は変わりません。digest汚れ検出機構は触発されていません。fooのwatchを検出するのは実行されていません。$apply()メソッドの2つの形態
1)無参
$scope.$apply();
element.bind('click', function() {
scope.foo++;
//if error
scope.$apply();
});
このような形式を使うと、scope.$appyの前にプログラムに異常が発生したら、scope.$appyは実行されません。インターフェースは更新されません。2)有参
$scope.$apply(function(){
...
})
element.bind('click', function() {
scope.$apply(function() {
scope.foo++;
});
})
このような形で、後に異常が発生してもデータは更新されます。AnglarJSでは$ウォッチを使用します。
よく使う使い方:
$scope.name = 'Hello';
$scope.$watch('name', function(newValue, oldValue) {
if (newValue === oldValue) { return; }
$scope.updated++;
});
$watch()に導入された第二のパラメータは、nameの値が変化したときに呼び出されるコールバック関数です。傍受する対象が対象である場合は、3番目のパラメータが必要です。
$scope.data.name = 'Hello';
$scope.$watch('data', function(newValue, oldValue) {
if (newValue === oldValue) { return; }
$scope.updated++;
}, true);
比較を表すのは、参照ではなく対象の値です。3番目のパラメータtrueを追加しないと、data.nameが変化したときには、同じ参照であるため、対応する動作はトリガされません。締め括りをつける
1)ページには$scope変数だけが結びつけられています。
2)$appyはイベントがangglar contextに入るかどうかを決定します。
3)$digest循環検査modelは最低2回、最大10回(10回以上の例外を投げて、無限検査を防止する)
4)AnglarJsが持っている命令はすでに$applyを実現しました。ですから、私達が追加で作成する必要はありません。
5)カスタムコマンドの場合は、functionパラメータ付きのapplyを推奨します。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。