我有一个带有两个对象的虚拟机:
vm.obj = {
intObj1: {
title: 'title1'
},
intObj2: {
name: 'name1'
}
}
vm.obj绑定到视图(我使用控制器作为语法)
我想拥有原始数据,所以我使用lodash克隆了模型:
var originalModelState = _.cloneDeep(vm.obj);
我正在观察模型与原始状态相比的变化:
$scope.$watch('vm.obj', function(newValue, oldValue){
if (newValue !== originalModelState){
}
}, true);
可悲的是newValue !== originalModelState
总是不同的,这是预期的,因为参考不同。我还尝试将newValue
与oldValue
进行比较,但问题是如果用户更改了一个属性,例如:vm.obj.intObj1.title = 'new title'
,然后更改回原始值`vm.obj.intObj1。 title =' title1'我无法检测到vm与原始值相同。我怎么能这样做?
答案 0 :(得分:2)
您是否考虑过
var originalModelState = JSON.stringify(vm.obj);
...
if (JSON.stringify(newValue) != originalModelState){
}
将对象作为字符串进行比较是发现差异的一种非常有效且简单的方法,尤其是在您不知道要查找的内容时。
答案 1 :(得分:0)
不确定,如果我理解你想问的是什么。仅当对象中的某些内容发生更改时,才会执行观察者回调。 'true'表现得很深。
如果您只想知道,如果对象深处的值等于同一位置的原始值,您可以检查观察者:
$scope.$watch('vm.obj', function(newValue){
if (originalModelState.intObj1.title === newValue.intObj1.title) {
// do something
}
}, true);