ホームページ  >  記事  >  ウェブフロントエンド  >  angularjs のデータ バインディング

angularjs のデータ バインディング

不言
不言オリジナル
2018-07-09 15:52:301634ブラウズ

この記事では主にangularjsのデータバインディングを紹介しますので、必要な友達は参考にしてください

angularjs1.Xのデータバインディングには3つのタイプがあります。データの同期と表示にはメソッドが使用されます。 angularjs 1.3 より前では、angularjs には two-way-bindingone-way-bindng の 2 つの方法しかありませんでした >そして、one-time-binding と呼ばれるバインド メカニズムが導入されました。

現在、angularjs には次の 3 つのデータ バインディング メソッドがあります: angularjs 1.3  之前,angularjs 只存在两种方式: two-way-bindingone-way-bindng , 而后则引入了称为one-time-binding 的绑定机制。

目前angularjs 中存在以下三种数据绑定方式:

  • two-way-binding

  • one-way-binding

  • one-time-binding

two-way-binding

angularjs 中的 Two-way-binding 的作用是将 ModelView 关联起来,任何一侧的数据变更都会更新另一侧的数据。

常见场景是页面中的输入区域。双向绑定可以很容易的将输入控件的值关联到数据模型中。

<input type="text" id="text"  ng-model="name"/>

通过 ng-model 我们可以很容易的将输入框(view)的值和 name (Model) 关联起来。在双向数据流的作用下,无论是我们修改输入框的值还是修改 name,另外一侧都将及时更新到新数据。

ng-modelangularjs 内置的一个指令用来实现双向绑定。ng-model 在不同生命周期中,有不同的逻辑处理。

  1. compilation phase:

    1. ng-model 指令和 input 指令会被合并处理给 input 标签 注册 keydown事件(DOM Event);

    2. interpolation 则注册一个 $watch 用来订阅 change 事件(angularjs Event)。

  2. Runtime Phase

    1. 用户输入触发 keydown

    2. input  指令捕获 keydown 事件,调用 $apply 来请求更新动作。

    3. angularjs 更新值到 Model

    4. 进入 $digest 上下文

    5. $watch 表达式检测到  Model   发生了 change,通知interpolation ,请求 更新 DOM

    6. angularjs 托管结束,退出托管,交还控制权到 JavaScript 执行上下文。

    7. 最后浏览器重新渲染文本。

One-way-binding

不同于 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 有部分相同的机制。

  1. compilation phase:

    1. interpolation 注册一个 $watch 用来订阅 change 事件(angularjs Event)。

  2. runtime phase:

    1. angularjs 进入 $digest

    2. expression$watch 检测到数据发生变更,通知interpolation ,请求 更新 DOM

    3. angularjs 托管结束,退出托管,交还控制权到 JavaScript 执行上下文。

    4. 最后浏览器重新渲染文本。

one-time-binding

1.3 之后,angularjs 实现了一个叫 one-time-binding 的机制。本质上它的机制和其他两种方式没太多差异,但在数据更新时候表现的不太一样。

one-time-binding 同样会注册 $watch

  • two-way-binding
  • 一方向バインディング🎜
  • 🎜ワンタイムバインディング🎜

双方向バインディング

🎜angularjs 双方向バインディング の機能は、ModelView を関連付けることで、どちらかの側でデータが変更されると、もう一方の側のデータも更新されます。 。 🎜🎜 一般的なシナリオは、ページ上の入力領域です。双方向バインディングにより、入力コントロールの値を 🎜データ モデル🎜 に簡単に関連付けることができます。 🎜
<span>{{::name}}</span>
🎜 ng-model を通じて、入力ボックスの値 (view) と name の値 () を簡単に組み合わせることができます。モデル code>)が関連付けられています。双方向データ フローのアクションの下では、入力ボックスの値を変更するか、<code>name を変更するかにかかわらず、反対側は時間内に新しいデータで更新されます。 🎜🎜ng-model は、双方向バインディングを実装するための angularjs の組み込みディレクティブです。 ng-model には、異なるライフサイクルで異なる論理処理があります。 🎜
  1. 🎜コンパイルフェーズ:🎜
    1. 🎜ng-model ディレクティブと input ディレクティブはマージされ、input タグに処理されて、keydown を登録します。 > イベント (DOM イベント); 🎜
    2. 🎜interpolation 次に、$watch を登録して change イベントをサブスクライブします ( angularjs イベント) 。 🎜
  2. 🎜実行時フェーズ🎜
    1. 🎜ユーザー入力が keydown をトリガーします🎜
    2. 🎜input 命令は keydown イベントをキャプチャし、$apply を呼び出します更新アクションを要求します。 🎜
    3. 🎜angularjs は値を Model に更新します🎜
    4. 🎜 $digest コンテキストを入力します🎜 li>
    5. 🎜$watch この式は、Modelchange があることを検出し、interpolation を通知します。そして、Update DOM をリクエストします。 🎜
    6. 🎜angularjs ホスティングが終了し、ホスティングを終了し、制御を JavaScript 実行コンテキストに返します。 🎜
    7. 🎜最後に、ブラウザはテキストを再レンダリングします。 🎜

一方向バインディング

🎜 双方向バインディング の双方向フローとは異なります。 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 と部分的に同じです。 🎜
  1. 🎜コンパイルフェーズ:🎜
    1. 🎜interpolation $watch を登録して、change イベント (angularjs イベント) をサブスクライブします。 🎜
  2. 🎜実行時フェーズ: 🎜
    1. 🎜angularjs $digest と入力します。 🎜
    2. 🎜expression$watch はデータの変更を検出し、interpolation を通知し、DOM の更新をリクエストします。 。 🎜
    3. 🎜angularjs ホスティングが終了し、ホスティングを終了し、制御を JavaScript 実行コンテキストに返します。 🎜
    4. 🎜最後に、ブラウザはテキストを再レンダリングします。 🎜

one-time-binding

🎜1.3 その後、angularjs は ワンタイムバインディングメカニズム。本質的に、そのメカニズムは他の 2 つのメソッドとそれほど変わりませんが、データが更新されたときの動作が異なります。 🎜🎜one-time-binding は、データの変更を監視するために $watch も登録しますが、初めてデータ 🎜未定義🎜 を検出すると監視をキャンセルします。 。 🎜
<span>{{::name}}</span>

对于上面的代码,假设 nameundefined -> angularjs -> angular ,最终渲染的结果是 angularjs ,而不是 angular 。 这就是 one-time-binding 的特殊之处,当 nameundefined 变化为 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中文网!

相关推荐:

jQuery/Vue的鼠标移入移出效果

addEventListener中的EventListener的接口对象

以上がangularjs のデータ バインディングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。