1 我们先来看一个简单的双向数据绑定的demo
1.1点击按钮,数据的变化会实现在页面上显示出来
|
|
1.2 angular底层是如何实现这种数据的双向绑定的呢?(参阅angular沉思录)
铺垫一点基础知识
|
|
|
|
2 angular中的\$apply \$digest
首先我们来看下它们的作用,当我们在angularjs之外的上下文改变了model的时候,如何让angular进行页面的刷新呢?
|
|
这个时候我们是通过javascript处理函数改变了scope的counter值,此时会发现view视图上并不会跟随变化,但是控制打印出来的却是变化了的值。这是因为
- angularjs只负责发生在angularjs上下文中的对于models 的更改会做出自动的回应(也就是$apply方法中对于model的更改orangular内置的其他服务)
- 对于angular上下之外的其他地方修改的model,这个时候就需要手动调用$apply来触发一轮\$digest检测
- build-in的一些 ng-event指令以及ng-model $timeout \$interval 等都会自动触发一次\$digest循环
$timeout(fn,delay,optional,pass) 第一个参数是执行函数,第二参数是延迟时间,第三个参数是是否进行脏值检测,默认是true,如果设置为false,则model数据的更新不会在视图上同步,pass是传递到执行函数的参数
|
|
$interval(fn,delay,count,optional,pass) 第一个参数是执行函数,第二个参数是延迟时间,第三个参数是fn执行的次数,第四个参数表示是否进行脏值检测,第五个蚕食表示传递的参数
|
|
以上代码指令自定义可以变成以下三种方式
|
|
or
|
|
此时会发现view视图会随着model的改变实时更新了
再来个栗子
|
|
|
|
3 angular中的 $ watch
在上面的情况中,我们通过$apply \$digest函数的调用就可以将model模型上的数据变化实时反应在view层上,但是我们有没有思考为什么会model层的改变会实时显示在view层呢?这个时候就是watch的主要作用了当我们写下表达式,比如 的时候,angularjs在幕后为我们做了一件事情,
|
|
也就是说,底层原理来讲是$watch回调函数的调用来执行的实时的数据更新,那么angularjs是怎么知道什么时候去调用这个回调函数呢?先抛出这个问题,看下这个demo,
- 这种情况是scope模型上的数据改变了但是没有触发watch函数的情况,因为我们没有进行脏值检测$digest或者\$apply
|
|
控制台会循环输出 1 和 age的递增 ;
这个时候我们就需要思考了?通过什么方式触发$watch呢?修改change函数
|
|
这个时候我们会发现控制台会循环执行watch函数