发表于: 2017-01-13 02:01:15
2 1352
今天完成的事:完成分页
明天计划的事:开始任务11
遇到的问题:今天学习了$watch、$apply、$digest的作用,理解这三个东西对于数据绑定很有效果。
在使用AngulaJS编写应用时,我们经常需要做的一件事情就是对模型中的变量进行监视,并对其发生的变化做出相应的回应。AngularJS为我们提供了一个非常方便的$watch方法,它可以帮助我们在每个scope中监视其中的变量。
在AngularJS内部,每当我们对ng-model绑定的name属性进行一次修改,AngularJS内部的$digest就会运行一次,并在运行结束之后检查我们使用$watch来监视的东西,如果和进行上一次$digest之前相比有了变化,则执行我们在其中绑定的处理函数。
$watch在对待原始类型和引用类型会有不同的处理方式,这就要首先说一说$watch函数的第三个参数。$watch函数有接收两个参数,第一个参数是需要监视的对象,第二个参数是在监视对象发生变化时需要调用的函数,实际上$watch的第三个参数,它在默认情况下是false。在默认情况下,即不显式指明第三个参数或者将其指明为false时,我们进行的监视叫做“引用监视”。一组数据,只要不是被另一组数据完全替代,那么就算数据中有一些小改动也是不会触发$watch的,如果我们将$watch的第三个变量设置为true,那么此时我们进行的监视叫做“全等监视”,那么一有风吹草动就会立即反映出来。
那么,AngularJS是如何知晓模型发生了变化,才调用了对应的$watch回调函数呢?它会周期性的运行一个函数来检查scope模型中的数据是否发生了变化吗?好吧,这就是$digest循环的用武之地了。在调用了$scope.$digest()后,$digest循环就开始了。假设你在一个ng-click指令对应的handler函数中更改了scope中的一条数据,此时AngularJS会自动地通过调用$digest()来触发一轮$digest循环。当$digest循环开始后,它会触发每个$watch。这些$watch会检查scope中的当前model值是否和上一次计算得到的model值不同。如果不同,那么对应的回调函数会被执行。
总结:$apply 方法作用:Scope提供$apply方法传播Model的变化
$watch()方法监视Model 的变化。
$digest()方法进行循环,开始后,它会触发每个watcher。这些watchers会检查scope中的当前model值是否和上一次计算得到的model值不同。如果不同,那么对应的回调函数会被执行。
收获:学习了$watch、$apply、$digest的作用
评论