控制器:
$scope.$watch('userData', function(val, oldVal){
if(!val){
return;
}
console.log(filtersService.lastChange(val, oldVal))
}, true);
服务:
.service('filtersService', function() {
var _lastChange = {};
var api = {
lastChange: function(val, oldVal, nested){
var __filters = ['filters', 'weights'];
if(angular.equals(val, oldVal)){
return;
}
for(var i in val){
if(!nested){
if(__filters.indexOf(i) == -1){
continue;
}
_lastChange = {};
}
if(typeof val[i] == 'object'){
if(!angular.equals(val[i], oldVal[i])){
if(!nested){
_lastChange[i] = api.lastChange(val[i], oldVal[i], true);
}
else{
_lastChange[i] = angular.copy(val[i]);
}
}
}
else if(val[i] != oldVal[i]){
var __obj = {}
__obj[i] = val[i];
return __obj;
}
}
return _lastChange;
}
};
return api;
});
我有一个$ watcher,它监视一个表示可以由用户更改的表单数据的对象。 当然,oldVal与val的区别仅在于一个元素,通常是原始元素。 表单数据由3级嵌套组成,因此确定我使用递归的差异,以便允许用户重置除了上次更改之外的所有过滤器(对于没有结果的场景的便利功能)。 / p>
数据示例:
val = {
age: 50,
filters: {
brands: "a_naturals",
flavors: "Caramel",
ingredients: null
},
gender: "male",
weight: 50
}
oldVal = {
age: 50,
filters: {
brands: "naturals",
flavors: "Caramel",
ingredients: "sugar"
},
gender: "male",
weight: 50
}
我希望返回的值为{filters:{ingredients:null}},但它无法正常工作,并且由于某种原因未达到递归停止条件。 它也不适用于3级嵌套。
当其中一个原始值或简单嵌套值更改为非空值(typeof null ==='object'issue?)时,它确实有效。