javascript - Angular 深度比较除特定属性外的对象

标签 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 没有解决我的问题,因为
选项 1 根本不是解决方案,说如果我不想看的属性没有改变 - 什么都不做,但这正是我想忽略的属性(不管它是否改变了)。
选项 2 使该属性根本无法比较,我只想在这种特定情况下忽略它,而不是根据定义使其无法比较。

最佳答案

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

来自 Angular.js 代码:

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

例如:
var object1 = {propertyOne: '1', $myCustomHiddenField: 'something'};
var object2 = {propertyOne: '1', $myCustomHiddenField: 'something else'};
var result = angular.equals(object1, object2);//这是真的

equals方法可以引用here .

关于javascript - Angular 深度比较除特定属性外的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36278915/

相关文章:

javascript - 谷歌街景黑屏

javascript - 如何在 AngularJS 中自定义下拉菜单?

javascript - 在 ng-switch-when 上加载外部脚本

java - 用 Scala 继承 'object'

c# - 如何在 C# 中返回对不可修改对象的引用

javascript - 访问 Javascript 节点列表中的项目以更改图像

javascript - 在 div 上使用 jQuery scrolltop 和 fadein/fadeout

javascript - 使用Jquery控制动态生成的HTML

javascript - 带有 protractorjs 的 Angular 2 失败 : Error while waiting for Protractor to sync with the page: "window.getAllAngularTestabilities is not a function"

javascript - 如何在 jQuery 中的每个循环中将数据插入数组中