【问题标题】:Angular deep compare objects except for specific propertiesAngular 深度比较对象(特定属性除外)
【发布时间】:2016-07-16 16:34:34
【问题描述】:

用例:

$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 使该属性完全不可比,我只想在这种特定情况下忽略它,而不是让它在定义上不可比。

【问题讨论】:

标签: javascript angularjs object comparison watch


【解决方案1】:

您可以在属性前加上 $,它不会被包含在等号比较中。 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

【讨论】:

  • 我也在为此苦苦挣扎。这非常有效。先生拯救了我的一天!
猜你喜欢
  • 1970-01-01
  • 2010-12-15
  • 2021-12-31
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
相关资源
最近更新 更多