AngularJS:$watching函数会导致infinte$digest循环

AngularJS:$watching函数会导致infinte$digest循环,angularjs,watch,Angularjs,Watch,普朗克: 我在FilterArray中有许多Filter对象。模板绑定到筛选器内部的状态。FilterArray的工作是使用状态函数确定所有过滤器的总状态 angular.module('app', []) // A filter .factory('Filter', function() { return function(state) { return { state: state }; }; }) // An array of filters wit

普朗克:

我在FilterArray中有许多Filter对象。模板绑定到筛选器内部的状态。FilterArray的工作是使用状态函数确定所有过滤器的总状态

angular.module('app', [])

// A filter
.factory('Filter', function() {
  return function(state) {
    return {
      state: state
    };
  };
})

// An array of filters with a state() function
.factory('FilterArray', function(Filter) {
    return function(filters) {
      return {
        filters: filters,
        state: function() {
          return this.filters.map(function(filter) {
            return filter.state;
        });
      }
    };
  }
})

.controller('FilterCtrl', function($scope, Filter, FilterArray) {
  $scope.filterArray = new FilterArray([
    new Filter(true),
    new Filter(false)
  ]);

  $scope.$watch('filterArray.state()', function(data) {
    console.log(data);
  });
})

;
现在,当我尝试$watch这个函数时,会出现一个无限的$digest循环。我的想法是,当FilterArray的状态改变时,我想广播一个事件

关于为什么会发生这种情况以及构建它的正确方法,有什么建议吗


谢谢

-问题是您正在返回一个新数组,因此每次调用函数时都会返回一个新引用。在内部,AngularJS对新旧值进行了严格的比较。具有不同引用的数组,即使它们包含相同的内容,也会触发$digest循环。再加上每次调用函数时都有不同的引用,然后进入无限循环,这是有道理的。但如何防止生成新阵列?FilterArray不知道也不应该关心其筛选器的状态。Array.prototype.map创建一个新数组,其结果是在此数组中的每个元素上调用提供的函数。-所以首先你不能使用地图。您需要一种执行映射的方法,但返回相同的数组…因此改为基本for循环?或者您可以添加true作为$watch的附加参数,这将执行深度相等比较,而不是引用比较。对…我非常反对深度观察,以至于忘了这是一个解决方案: