当监视值是对象时,在Angular $ watch函数中获取精确差异

时间:2014-08-27 18:52:14

标签: javascript angularjs recursion

控制器:

 $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?)时,它确实有效。

0 个答案:

没有答案