この記事では主にangularjsのデータバインディングを紹介しますので、必要な友達は参考にしてください
angularjs 1.3
より前では、angularjs
には two-way-binding
と one-way-bindng
の 2 つの方法しかありませんでした >そして、one-time-binding
と呼ばれるバインド メカニズムが導入されました。 現在、angularjs
には次の 3 つのデータ バインディング メソッドがあります: angularjs 1.3
之前,angularjs
只存在两种方式: two-way-binding
和 one-way-bindng
, 而后则引入了称为one-time-binding
的绑定机制。
目前angularjs
中存在以下三种数据绑定方式:
two-way-binding
one-way-binding
one-time-binding
angularjs
中的 Two-way-binding
的作用是将 Model
和 View
关联起来,任何一侧的数据变更都会更新另一侧的数据。
常见场景是页面中的输入区域。双向绑定可以很容易的将输入控件的值关联到数据模型中。
<input type="text" id="text" ng-model="name"/>
通过 ng-model
我们可以很容易的将输入框(view
)的值和 name
(Model
) 关联起来。在双向数据流的作用下,无论是我们修改输入框的值还是修改 name
,另外一侧都将及时更新到新数据。
ng-model
是 angularjs
内置的一个指令用来实现双向绑定。ng-model
在不同生命周期中,有不同的逻辑处理。
compilation phase:
ng-model
指令和 input
指令会被合并处理给 input
标签 注册 keydown
事件(DOM Event);
interpolation
则注册一个 $watch
用来订阅 change
事件(angularjs Event)。
Runtime Phase
用户输入触发 keydown
input
指令捕获 keydown
事件,调用 $apply
来请求更新动作。
angularjs
更新值到 Model
进入 $digest
上下文
$watch
表达式检测到 Model
发生了 change
,通知interpolation
,请求 更新 DOM
。
angularjs
托管结束,退出托管,交还控制权到 JavaScript 执行上下文。
最后浏览器重新渲染文本。
不同于 Two-way-binding
的双向流动, one-way-binding
的数据流向是单向,即只会从 model
流向 view
,而不会从 view
流向 model
。 因此, one-way-binding
用来展示数据,而不是获取输入。
在 angularjs
中, one-way-binding
则有两种语法: ng-bind
和 {{expression}}
。
<span ng-bind="name"> </span> <span>{{name}}</span>
对于 one-way-binding
来说,内部机制和 two-way-binding
有部分相同的机制。
compilation phase:
interpolation
注册一个 $watch
用来订阅 change
事件(angularjs Event)。
runtime phase:
angularjs
进入 $digest
。
expression
的 $watch
检测到数据发生变更,通知interpolation
,请求 更新 DOM
。
angularjs
托管结束,退出托管,交还控制权到 JavaScript 执行上下文。
最后浏览器重新渲染文本。
1.3
之后,angularjs
实现了一个叫 one-time-binding
的机制。本质上它的机制和其他两种方式没太多差异,但在数据更新时候表现的不太一样。
one-time-binding
同样会注册 $watch
angularjs
双方向バインディング
の機能は、Model
と View
を関連付けることで、どちらかの側でデータが変更されると、もう一方の側のデータも更新されます。 。 🎜🎜 一般的なシナリオは、ページ上の入力領域です。双方向バインディングにより、入力コントロールの値を 🎜データ モデル🎜 に簡単に関連付けることができます。 🎜<span>{{::name}}</span>
ng-model
を通じて、入力ボックスの値 (view
) と name
の値 () を簡単に組み合わせることができます。モデル code>)が関連付けられています。双方向データ フローのアクションの下では、入力ボックスの値を変更するか、<code>name
を変更するかにかかわらず、反対側は時間内に新しいデータで更新されます。 🎜🎜ng-model
は、双方向バインディングを実装するための angularjs
の組み込みディレクティブです。 ng-model
には、異なるライフサイクルで異なる論理処理があります。 🎜ng-model
ディレクティブと input
ディレクティブはマージされ、input
タグに処理されて、keydown
を登録します。 > イベント (DOM イベント); 🎜interpolation
次に、$watch
を登録して change
イベントをサブスクライブします ( angularjs イベント) 。 🎜keydown
をトリガーします🎜input
命令は keydown
イベントをキャプチャし、$apply
を呼び出します更新アクションを要求します。 🎜angularjs
は値を Model
に更新します🎜$digest
コンテキストを入力します🎜 li>$watch
この式は、Model
に change
があることを検出し、interpolation
を通知します。そして、Update DOM
をリクエストします。 🎜angularjs
ホスティングが終了し、ホスティングを終了し、制御を JavaScript 実行コンテキストに返します。 🎜双方向バインディング
、 の双方向フローとは異なります。 one-way - -binding
のデータ フロー方向は一方向です。つまり、model
から view
へのみ流れますが、view から model
へ。 したがって、one-way-binding
は、入力を取得するためではなく、データを表示するために使用されます。 🎜🎜 angularjs
の one-way-binding
には、ng-bind
と {{expression}}
の 2 つの構文があります。 >。 🎜rrreee🎜 one-way-binding
の場合、内部メカニズムは two-way-binding
と部分的に同じです。 🎜interpolation
$watch
を登録して、change
イベント (angularjs イベント) をサブスクライブします。 🎜angularjs
$digest
と入力します。 🎜expression
の $watch
はデータの変更を検出し、interpolation
を通知し、DOM の更新をリクエストします。 。 🎜
angularjs
ホスティングが終了し、ホスティングを終了し、制御を JavaScript 実行コンテキストに返します。 🎜1.3
その後、angularjs
は ワンタイムバインディングメカニズム。本質的に、そのメカニズムは他の 2 つのメソッドとそれほど変わりませんが、データが更新されたときの動作が異なります。 🎜🎜one-time-binding
は、データの変更を監視するために $watch
も登録しますが、初めてデータ 🎜未定義🎜 を検出すると監視をキャンセルします。 。 🎜<span>{{::name}}</span>
对于上面的代码,假设 name
从 undefined
-> angularjs
-> angular
,最终渲染的结果是 angularjs
,而不是 angular
。 这就是 one-time-binding
的特殊之处,当 name
从 undefined
变化为 angularjs
之后,被认定为 name
的状态已经是 stable
,因此将取消 $watch
, 即不再监听数据变化。
那么,假设 name
从 ''
-> angularjs
-> angular
, 则渲染结果是 ''
,即空字符串(第一次的值)。因为 one-time-binding
在计算 stable
时候使用的 严格相等,即 newVal === undefined
, 如果是,则继续保留 $watch
等待下一次的比较;否则,状态变更为 stable
,取消 $watch
, 数据转化为最终态。
在我看来,angularjs
核心在于 angularjs context
和 $digest
。
angularjs context
保证 angularjs
可以捕获到各种事件,用户输入、鼠标事件、键盘事件、甚至 $settimeout
和 $http
等异步行为的状态流转。
而 $digest
则保证 angularjs
可以确认是否要更新数据。
文中难免存在一些错误,欢迎大家斧正。
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
addEventListener中的EventListener的接口对象
以上がangularjs のデータ バインディングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。