在angularjs1.x 中存在了三种数据绑定的方式,用于数据的同步、展示。在 angularjs 1.3 之前,angularjs 只存在两种方式: two-way-binding 和 one-way-bindng , 而后则引入了称为one-time-binding 的绑定机制。
目前angularjs 中存在以下三种数据绑定方式:
two-way-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 在不同生命周期中,有不同的逻辑处理。
1、compilation phase:
2、runtime phase
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:
2、runtime phase:
one-time-binding
1.3 之后,angularjs 实现了一个叫 one-time-binding 的机制。本质上它的机制和其他两种方式没太多差异,但在数据更新时候表现的不太一样。
one-time-binding 同样会注册 $watch 来监听数据变化,但它会在第一次检测到数据 非 undefined 时候取消监听。
<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 可以确认是否要更新数据。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。
如对本文有疑问, 点击进行留言回复!!
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
使用 Angular RouteReuseStrategy 缓存(路由)组件的实例代码
分享Angular http interceptors 拦截器使用(推荐)
网友评论