一尘不染

angularjs $ watch旧值和新值相同

angularjs

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

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

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


阅读 309

收藏
2020-07-04

共1个答案

一尘不染

您可以$watch改用,这似乎可行。如果您还想监视对象上的所有属性(如您所做的那样),则需要将true第三个参数添加到监视中。这建立了一个深层的监视。

这是一个正在工作的家伙。

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);
});
2020-07-04