欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Angular中的$watch、$watchGroup、$watchCollection

程序员文章站 2022-05-15 07:56:46
•  1,原型:$watch: function(watchexp, listener, objectequality, prettyprintexp...

•  1,原型:$watch: function(watchexp, listener, objectequality, prettyprintexpression){};

•  2,参数:watchexp(必须):{(function()|string)},可以字符串表达式,也可以带当前scope为参数的函数

•    - `string`: evaluated as guide/expression expression}

•    - `function(scope)`: called with current `scope` as a parameter.

• 3,参数:listener(必须):function(newval, oldval, scope),观察的表达式变化的时候调用的函数。

• 4,参数:objectequality(非必须):是否监视个对象,默认为false

• 5,$scope.$digest().会执行所有的同$scope下的$watch。

•     但会出错$apply already in progress,换了$rootscope也一样。

•     原因-参考大牛博客:

•     $digest、$apply、$$phase这些属性或者方法其实都是$scope中的私有的,最好不要使用。

• 6,$watch一个对象。

•    如果要监视对象的变化(地址改变),$watch对象名,第三个参数默认;

•    如果监测对象中某一属性,可以写user.name的形式,第三个参数默认;

•     如果监测对象中全部属性,$watch对象名,第三个参数true;

• 7,$watchgroup,第一个参数是一个表达式的数组或者返回表达式的数组的函数。

• 8,$watchcollection;

•     js中数组也是对象,但按照$watch一个对象的方式,只有数组引用变了才能监听变化,增加删除$watch监听不到,所以就有了$watchcollection。

•     function(obj, listener):第一个参数必须对象或者返回对象的函数。

•9,注销$watch

•         $watch函数返回一个注销监听的函数,太多的$watch将会导致性能问题,$watch如果不再使用,我们最好将其释放掉。

一、使用方法

html

<div ng-controller="ctrl">
    <h2>$watch</h2>
    <div>
      <input type="text" ng-model="value1"/>
    </div>
    <div ng-bind="w1"></div>
    <h2>$watchgroup</h2>
    <div>
      <input type="text" ng-model="value2"/>
      <input type="text" ng-model="value3"/>
    </div>
    <div ng-bind="w2"></div>
    <h2>$watchcollection</h2>
    <ul>
      <li ng-repeat="v in arr" ng-bind="v"></li>
    </ul>
    <div ng-bind="w3"></div>
  </div>

js

 angular.module('nickapp', [])
        .controller("ctrl", ["$scope", "$timeout", function ($scope, $timeout) {
          // $watch
          var watcher = $scope.$watch("value1", function (newval, oldval) {
            $scope.w1 = "$watch--" + "new:" + newval + ";" + "old:" + oldval;
            if (newval == 'clear') {//设置一个注销监听的条件
              watcher(); //注销监听
            }
          });
          // $watchgroup
          $scope.$watchgroup(["value2", "value3"], function (newval, oldval) {
            //注意:newval与oldval都返回的是一个数组
            $scope.w2 = "$watchgroup--" + "new:" + newval + ";" + "old:" + oldval;
          });
          //  $watchcollection
          $scope.arr = ['nick', 'ljy', 'ljj', 'zhw'];
          $scope.$watchcollection('arr', function (newval, oldval) {
            $scope.w3 = "$watchcollection--" + "new:" + newval + ";" + "old:" + oldval;
          });
          $timeout(function () {
            $scope.arr = ['my', 'name', 'is', 'nick'];
          }, 2000);
        }])

二、小案例

html

<h2>小案例</h2>
  <ul>
    <li ng-repeat="item in items.goodsarr">
      <p ng-bind="item.goods"></p>
      <p>
        <span>单价:</span>
        <span ng-bind="item.price"></span>
      </p>
      <div>
        <input type="number" ng-model="item.num">
        <span>个</span>
      </div>
    </li>
  </ul>
  <div>
    <span>总计:</span>
    <span ng-bind="items.sum"></span>
    <span>元</span>
  </div>

js          

 //     小案例
        .factory('watchservice', [function () {
          var items = {
            goodsarr: [{
              goods: 'goods1',
              price: 10,
              num: ''
            }, {
              goods: 'goods2',
              price: 20,
              num: ''
            }],
            sum: 0
          };
          return {
            getitemssave: function () {
              return items;
            }
          };
        }])
        .controller('bodyctl', ['$scope', 'watchservice', function ($scope, watchservice) {
          $scope.items = watchservice.getitemssave();
//          这里要监听数量变化计算综合
          //一 只监听所有num变化计算总额
          var watcharr = [];
          $scope.items.goodsarr.foreach(function (v, i) {
            watcharr.push("items.goodsarr[" + i + "]['num']");
          });
          $scope.$watchgroup(watcharr, function (newval, oldval) { //注意:newval与oldval都返回的是一个数组
            $scope.items.sum = 0;
            $scope.items.goodsarr.foreach(function (v, i) {
              $scope.items.sum += v.price * (v.num > 0 ? v.num : 0);
            });
          });
/*
          //二 这样写则监听items.goodsarr所有成员
          $scope.$watch('items.goodsarr', function () {
            $scope.items.sum = 0;
            $scope.items.goodsarr.foreach(function (v, i) {
              $scope.items.sum += v.price * (v.num > 0 ? v.num : 0);
            });
          }, true);*/
        }])

全部代码

<!doctype html>
<html ng-app="nickapp">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
  <title>angular之$watch、$watchgroup、$watchcollection</title>
  <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
  <script>
    /*
     * 1,原型:$watch: function(watchexp, listener, objectequality, prettyprintexpression){};
     * 2,参数:watchexp(必须):{(function()|string)},可以字符串表达式,也可以带当前scope为参数的函数
     *    - `string`: evaluated as {@link guide/expression expression}
     *    - `function(scope)`: called with current `scope` as a parameter.
     * 3,参数:listener(必须):function(newval, oldval, scope),观察的表达式变化的时候调用的函数。
     * 4,参数:objectequality(非必须):是否监视个对象,默认为false
     * 5,$scope.$digest().会执行所有的同$scope下的$watch。
     *  但会出错$apply already in progress,换了$rootscope也一样。
     *  原因-参考大牛博客:http://blog.csdn.net/aitangyong/article/details/48972643
     *  $digest、$apply、$$phase这些属性或者方法其实都是$scope中的私有的,最好不要使用。
     * 6,$watch一个对象。
     *  如果要监视对象的变化(地址改变),$watch对象名,第三个参数默认;
     *  如果监测对象中某一属性,可以写user.name的形式,第三个参数默认;
     *  如果监测对象中全部属性,$watch对象名,第三个参数true;
     * 7,$watchgroup,第一个参数是一个表达式的数组或者返回表达式的数组的函数。
     * 8,$watchcollection;
     *   js中数组也是对象,但按照$watch一个对象的方式,只有数组引用变了才能监听变化,增加删除$watch监听不到,所以就有了$watchcollection。
     *   function(obj, listener):第一个参数必须对象或者返回对象的函数。
     */
    angular.module('nickapp', [])
        .controller("ctrl", ["$scope", "$timeout", function ($scope, $timeout) {
          // $watch
          var watcher = $scope.$watch("value1", function (newval, oldval) {
            $scope.w1 = "$watch--" + "new:" + newval + ";" + "old:" + oldval;
            /*
             *注销$watch
             *太多的$watch将会导致性能问题,$watch如果不再使用,我们最好将其释放掉。
             *$watch函数返回一个注销监听的函数,如果我们想监控一个属性,然后在稍后注销它,可以使用下面的方式:
             */
            if (newval == 'clear') {//设置一个注销监听的条件
              watcher(); //注销监听
            }
          });
          // $watchgroup
          $scope.$watchgroup(["value2", "value3"], function (newval, oldval) {
            //注意:newval与oldval都返回的是一个数组
            $scope.w2 = "$watchgroup--" + "new:" + newval + ";" + "old:" + oldval;
          });
          //  $watchcollection
          $scope.arr = ['nick', 'ljy', 'ljj', 'zhw'];
          $scope.$watchcollection('arr', function (newval, oldval) {
            $scope.w3 = "$watchcollection--" + "new:" + newval + ";" + "old:" + oldval;
          });
          $timeout(function () {
            $scope.arr = ['my', 'name', 'is', 'nick'];
          }, 2000);
        }])
        //     小案例
        .factory('watchservice', [function () {
          var items = {
            goodsarr: [{
              goods: 'goods1',
              price: 10,
              num: ''
            }, {
              goods: 'goods2',
              price: 20,
              num: ''
            }],
            sum: 0
          };
          return {
            getitemssave: function () {
              return items;
            }
          };
        }])
        .controller('bodyctl', ['$scope', 'watchservice', function ($scope, watchservice) {
          $scope.items = watchservice.getitemssave();
//          这里要监听数量变化计算综合
          //一 只监听所有num变化计算总额
          var watcharr = [];
          $scope.items.goodsarr.foreach(function (v, i) {
            watcharr.push("items.goodsarr[" + i + "]['num']");
          });
          $scope.$watchgroup(watcharr, function (newval, oldval) { //注意:newval与oldval都返回的是一个数组
            $scope.items.sum = 0;
            $scope.items.goodsarr.foreach(function (v, i) {
              $scope.items.sum += v.price * (v.num > 0 ? v.num : 0);
            });
          });
/*
          //二 这样写则监听items.goodsarr所有成员
          $scope.$watch('items.goodsarr', function () {
            $scope.items.sum = 0;
            $scope.items.goodsarr.foreach(function (v, i) {
              $scope.items.sum += v.price * (v.num > 0 ? v.num : 0);
            });
          }, true);*/
        }])
  </script>
</head>
<body ng-controller="bodyctl">
<div ng-view>
  <div ng-controller="ctrl">
    <h2>$watch</h2>
    <div>
      <input type="text" ng-model="value1"/>
    </div>
    <div ng-bind="w1"></div>
    <h2>$watchgroup</h2>
    <div>
      <input type="text" ng-model="value2"/>
      <input type="text" ng-model="value3"/>
    </div>
    <div ng-bind="w2"></div>
    <h2>$watchcollection</h2>
    <ul>
      <li ng-repeat="v in arr" ng-bind="v"></li>
    </ul>
    <div ng-bind="w3"></div>
  </div>
  <h2>小案例</h2>
  <ul>
    <li ng-repeat="item in items.goodsarr">
      <p ng-bind="item.goods"></p>
      <p>
        <span>单价:</span>
        <span ng-bind="item.price"></span>
      </p>
      <div>
        <input type="number" ng-model="item.num">
        <span>个</span>
      </div>
    </li>
  </ul>
  <div>
    <span>总计:</span>
    <span ng-bind="items.sum"></span>
    <span>元</span>
  </div>
</div>
</body>
</html>

以上所述是小编给大家介绍的angular中的$watch、$watchgroup、$watchcollection,希望对大家有所帮助