angularjs $ watch旧值和新值是一样的

 手机用户2502908277 发布于 2023-02-08 13:41

我的目的是在范围内观察模型,并找出旧值和新值之间的差异.

但是,我发现以下代码中的旧值和新值都是相同的.

app.controller('MyCtrl', function($scope, $timeout){
  $scope.markers = {};
  $scope.$watchCollection('markers', function(newValue, oldValue){
    console.log('being watched oldValue:', oldValue, 'newValue:', newValue);
  });
  $timeout( function() {
    $scope.markers.foo = 1;
  }, 500);
  $timeout( function() {
    $scope.markers.bar = 2;
  }, 500);
});

输出:

being watched oldValue: Object {} newValue: Object {} script.js:6
being watched oldValue: Object {foo: 1} newValue: Object {foo: 1} script.js:6
being watched oldValue: Object {foo: 1, bar: 2} newValue: Object {foo: 1, bar: 2} 

为什么它们是相同的,如果它是故意的,为什么呢?

这是代码,http://plnkr.co/edit/rfMCF4x6CmVVT957DPSS?p=preview

3 个回答
  • $watch相反,你可以使用,这似乎工作.如果您想要观察对象上的所有属性(正如您所做的那样),则需要将true第三个参数添加到手表中.这设置了一个深刻的手表.

    这是一个工作的plunker.

    JS:

    app = angular.module('myApp',[]);
    
    app.controller('MyCtrl', function($scope, $timeout){
      $scope.markers = {};
      $scope.$watch('markers', function(newValue, oldValue){
        console.log('being watched oldValue:', oldValue, 'newValue:', newValue);
      }, true);
      $timeout( function() {
        $scope.markers.foo = 1;
      }, 500);
      $timeout( function() {
        $scope.markers.bar = 2;
      }, 500);
    });
    

    2023-02-08 13:42 回答
  • 我发现检查新旧值是否相等(在值中)非常有用,如果是这种情况,则跳过该过程以避免意外行为.您可以使用angular.equals来实现这一点.这是一个例子:

    JS:

    $scope.$watch('myObject', function(newValue, oldValue){
        if(angular.equals(newValue, oldValue)){
            return; // simply skip that
        }
    });
    

    2023-02-08 13:42 回答
  • 这是一个错误.

    https://github.com/angular/angular.js/issues/2621

    似乎没有修复.

    2023-02-08 13:43 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有