角度深度比较对象(特定属性除外)

Angular deep compare objects except for specific properties

本文关键字:属性 深度 比较 对象      更新时间:2023-09-26

用例:

$scope.$watch('settings', function (newVal, oldVal) {
   if (!angular.equals(oldVal, newVal)) {
       setDirty();
    }
}, true);

现在这实际上与相同

$scope.$watch('settings', function (newVal, oldVal) {
   if (oldVal) {
       setDirty();
    }
}, true);

由于CCD_ 1已经将两者进行了比较。

然而,有一个属性,即使它发生了变化,我也不想setDirty()

到目前为止,这是我的工作(破解)解决方案:

$scope.$watch('settings', function (newVal, oldVal) {
   if (!oldVal) return;
   var editedOldVal = angular.copy(oldVal, {});
   var editedNewVal = angular.copy(newVal, {});
   delete editedOldVal.propertyIDontWannaWatch;
   delete editedNewVal.propertyIDontWannaWatch;
   if (!angular.equals(editedOldVal, editedNewVal)) {
       setDirty();
   }
}, true);

有没有一种更干净的方法可以让angular.equals()$watch忽略特定的属性?

编辑:

这个答案并不能解决我的问题,因为
option 1根本不是一个解决方案,它说如果我不想看的属性没有改变-什么都不做,但这正是我想忽略的属性(不管它是否改变)
option 2使该属性根本不可比较,我只想在这个特定的情况下忽略它,而不是使其根据定义不可比较。

您可以在属性前面加一个$,它不会包含在equals比较中。angular.equals方法忽略以$开头的属性。

来自Angular.js代码:

if (key.charAt(0) === '$' || isFunction(o1[key])) continue;

例如:
var object1 = {propertyOne: '1', $myCustomHiddenField: 'something'};
var object2 = {propertyOne: '1', $myCustomHiddenField: 'something else'};
$watch0

这里可以引用equals方法。