从零学习Angularjs-watch、digest、apply三大方法解析

在我们使用Angularjs时,时常会遇到watch、digest、apply这三个方法,博主也是查了很多资料在这里简单的介绍一下这三个方法的使用。

$watch方法

watchscope w a t c h 是 一 个 s c o p e 函 数 , 用 于 监 听 模 型 变 化 , 当 你 的 模 型 部 分 发 生 变 化 时 它 会 通 知 你 。 watch(watchExpression, listener, objectEquality);
每个参数的说明如下:
watchExpression(必须):监听的对象,它可以是一个string,将被计算为表达式 ,或函数如function(){return $scope.name}。 listener:当watchExpression(监听对象)变化时会被调用的函数或者表达式,它接收3个参数:newValue(新值), oldValue(旧值), scope(作用域的引用) objectEquality:是否深度监听,如果设置为true,它告诉Angular检查所监控的对象中每一个属性的变化. 如果你希望监控数组的个别元素或者对象的属性而不是一个普通的值, 那么你应该使用它。

$digest方法

digestAngular d i g e s t : A n g u l a r 会 运 行 一 个 函 数 digest来检查scope模型中的数据是否发生了变化。 在 digestwatcherswatcherAngularJSscopewatcherangularwatcher d i g e s t 循 环 中 , w a t c h e r s 会 被 触 发 。 当 一 个 w a t c h e r 被 触 发 时 , A n g u l a r J S 会 检 测 它 所 监 听 的 s c o p e 模 型 , 如 果 监 听 对 象 发 生 了 变 化 那 么 关 联 到 该 w a t c h e r 的 回 调 函 数 就 会 被 调 用 。 这 种 方 法 叫 做 脏 检 查 。 在 a n g u l a r 程 序 初 始 化 时 , 会 将 绑 定 对 象 的 属 性 添 加 为 监 听 对 象 ( w a t c h e r ) , 也 就 是 说 一 个 scope对象绑定了N个属性,就会添加N个watcher。 angular什么时候去脏检查呢?angular所定义的方法中都会触发 digestcontrollerng d i g e s t 事 件 , 比 如 : c o n t r o l l e r 初 始 化 的 时 候 , 所 有 以 n g − 开 头 的 指 令 执 行 后 , 都 会 触 发 脏 检 查 用 户 与 视 图 发 生 交 互 行 为 以 后 会 触 发 脏 检 查 。 调 用 digest方法: scope. s c o p e . digest();

$apply方法

apply:AngularJS并不直接调用digest(),而是调用scope, apply(),apply方法就是将digest方法包装了一层,会调用rootScope.digest()。

因此,一轮digest循环在rootScope开始,随后会访问到所有的children scope中的watchers。 apply()方法接受一个可选参数,可以是string,string将被看作表达式并计算结果,也可以是函数。

当接受function作为参数,会执行该function并且触发一轮digest循环。不接受任何参数,触发一轮digest循环会,检查该scope里的所有监听的属性。 如果你在AngularJS上下文之外的任何地方修改了model,那么你就需要通过手动调用apply()来通知AngularJS。

三者关系整合例子

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>行程安排</title>
    <link href="../css/bootstrap.css" rel="stylesheet">
    <script src="../script/angular.min.js"></script>
    <script>
        var app = angular.module('myapp', []);
        app.controller("myController", function ($scope) {
            $scope.message = '原来的信息';
            $scope.getMessage = function(){
                setTimeout(function(){
            //message刚开始不是监听对象,对它加上$scope.$apply后才可以监听
                    $scope.$apply(function () {
                        $scope.message = '两秒后更新';
                        alert('message'+$scope.message);
                    });
                    //$scope.$apply();
                },2000)
            }
            $scope.getMessage();
        })
    </script>
</head>
<body ng-app="myapp" ng-controller="myController">
{{message}}
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值