用例:
$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
使该属性完全不具有可比性,我只想在这个特定情况下忽略它,而不是根据定义使其无法比拟。
答案 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。