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

时间:2016-03-29 08:17:06

标签: javascript angularjs object comparison watch

用例:

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

现在这几乎与

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

由于$watch已经比较了两者。

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

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

$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忽略特定属性?

编辑:

This answer无法解决我的问题,因为option 1根本不是解决方案,如果我不想看的财产没有改变了 - 什么都不做,但这正是我想忽略的属性(如果改变与否,请不要关心)。
option 2使该属性完全不具有可比性,我只想在这个特定情况下忽略它,而不是根据定义使其无法比拟。

1 个答案:

答案 0 :(得分:0)

您可以在属性前面加上$,并且它不会包含在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'};
var result = angular.equals(object1, object2);//this is true

equals方法可以引用为here