• AngularJS之watch


    简介

        首先apply方法会触发evel方法,当evel方法解析成功后,会去触发digest方法,digest方法会触发watch方法。

        在digest执行时,如果watch观察的的value与上一次执行时不一样时,就会被触发。

        AngularJS内部的watch实现了页面随model的及时更新。

        $watch方法在用的时候主要是手动的监听一个对象,但对象发生变化时触发某个事件。】

    语法

        $watch(watchFn,watchAction,deepWatch)

            watchFn:该参数是一个带有Angular 表达式或者函数的字符串,它会返回被监控的数据模型的当前值。这个表达式将会被执行很多次,所以你要保证它不会产生其他副作用。也就是说,要保证它可以被调用很多次而不会改变状态。基于同样的原因,监控表达式应该很容易被计算出来。如果你使用字符串传递了一个Angular 表达式,那么它将会针对调用它的那个作用域中的对象而执行。

         watchAction(newValue,oldValue,scope):这是一个函数或者表达式,当watchFn 发生变化时会被调用。如果是函数的形式,它将会接收到watchFn 的新旧两个值,以及作用域对象的引用。其函数签名为function(newValue, oldValue, scope)。

            deepWatch:如果设置为true,这个可选的布尔型参数将会命令Angular 去检查被监控对象的每个属性是否发生了变化。如果你想要监控数组中的元素,或者对象上的所有属性,而不只是监控一个简单的值,你就可以使用这个参数。由于Angular 需要遍历数组或者对象,如果集合比较大,那么运算负担就会比较重。

        $watch会返回一个函数,想要注销这个watch可以使用函数.
      var dereg = $scope.$watch('someModel.someProperty', callbackOnChange());
      dereg();
    

    用法 

        <h3>watch简单数据类型</h3>
        <div ng-controller="ng-watch">
            <input type="text" ng-model="num"><br/>
            <span ng-bind="'变化前的值-'+preVal"></span><br/>
            <span ng-bind="'变化后的值-'+val"></span><br/>
            <label ng-bind="'变化次数-'+count"></label>
        </div>
        m1.controller("ng-watch",["$scope",function($sc){
            $sc.num = 0;
            $sc.count = 0;
            $sc.preVal = "";
            $sc.val = "";
            $sc.$watch("num",function(newValue,oldValue){
                if(newValue!==oldValue){
                    $sc.preVal = oldValue;
                    $sc.val = newValue;
                    $sc.count++;
                }
           });
        }]);
    
        <h3>watch对象</h3>
        <div ng-controller="ng-watch2">
            <input type="text" ng-model="o.num"><br/>
            <span>{{'变化前的值-'+preObj}}</span><br/>
            <span>{{'变化后的值-'+obj}}</span><br/>
            <label ng-bind="'变化次数-'+count"></label>
        </div>
        m1.controller("ng-watch2",["$scope",function($sc){
            $sc.o = {"num": 0};
            $sc.count = 0;
            $sc.preObj = "";
            $sc.obj = "";
            $sc.$watch('o',function(newValue,oldValue){
                if(newValue!==oldValue){
                    $sc.preObj = oldValue;
                    $sc.obj = newValue;
                    $sc.count++;
                }
           },true);
        }]);
    

    效果:http://runjs.cn/detail/vnlh0eny


  • 相关阅读:
    img 的data-src 属性及懒加载
    try catch 用法
    input 的各种属性的验证 checkValidity兼容性
    表单提交的方法。
    通信原理
    计算机组成原理
    CREC 2017
    POJ 1201 Intervals
    HDU 3440 House Man
    poj 3169 Layout
  • 原文地址:https://www.cnblogs.com/zhx1991/p/4580868.html
Copyright © 2020-2023  润新知