角度深度比较对象(特定属性除外)
Angular deep compare objects except for specific properties
用例:
$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'};
$watch
0
这里可以引用equals方法。
相关文章:
- 在不知道深度或父属性的情况下从对象中删除属性
- lodash:深度复制对象,但不是所有属性
- jQuery深度扩展并保留所有属性
- 角度深度比较对象(特定属性除外)
- 找出 Vue.js 深度自定义指令中哪个属性发生了变化
- 在 Javascript 中,在执行深度复制时,由于属性为“this”,我如何避免循环
- JS中的深度属性
- NG-重复深度属性基于选择值进行过滤
- 使用 lodash 按属性名称提取深度嵌套的子对象
- 如何防止jQuery扩展深度副本复制我的一些自定义属性
- 在 JavaScript 中的对象中设置具有未知深度的属性值
- 切换嵌套的布尔对象属性(在任意深度)——可以不使用eval
- 给定一个对象数组,如何根据深度为n的属性对对象排序
- 如何检查一个深度属性是否存在
- 验证对象中是否存在深度属性
- Ember计算属性绑定到深度嵌套属性时不会触发
- 根据顺序更改深度嵌套Javascript对象中同名属性的多个值
- 在JavaScript中检查深度嵌套对象属性是否存在的最简单方法是什么?
- Chai中仅自身对象属性的深度对象等式
- Angularjs绑定到深度嵌套对象属性时的性能