Angularjs $scope.$watch内的angular.forEach()行为怪异-吐出重复项

Angularjs $scope.$watch内的angular.forEach()行为怪异-吐出重复项,angularjs,foreach,apply,watch,digest,Angularjs,Foreach,Apply,Watch,Digest,我正在设置$scope.$监视包含嵌套项的数组,代码如下: $scope.$watch("networks", function( newValue, oldValue ) { if(JSON.stringify(oldValue)===JSON.stringify(newValue)){ return false; }

我正在设置$scope.$监视包含嵌套项的数组,代码如下:

$scope.$watch("networks",
                    function( newValue, oldValue ) {
                      if(JSON.stringify(oldValue)===JSON.stringify(newValue)){
                        return false;
                      }
                      else if(!(angular.isUndefinedOrNull(newValue) || angular.isUndefinedOrNull(oldValue))){
                        var oldValueCount = 0;
                      var validIndexArray=[];
                      var newValueCount = 0;
                      angular.forEach(newValue, function(item,i){
                        if(item.isSelected=='false'){
                          newValueCount++;
                          validIndexArray.push(i);
                        }
                      });
                      angular.forEach(oldValue, function(item,i){
                        if(item.isSelected=='false'){
                          oldValueCount++;
                        }
                      });
                      console.log("oldValueCount is"+oldValueCount);
                      $scope.netObject = {"keyid": "","value": "","actual":""};
                      if(oldValueCount==newValueCount===0){return false;}
                        if($rootScope.planBody.length!==0){
                          $rootScope.planBody.campaign.networks = [];
                        }
                        angular.forEach(validIndexArray, function(item,i){
                          $scope.netObject.keyid=newValue[item].keyid;
                          $scope.netObject.value=newValue[item].value;
                          $scope.netObject.actual=newValue[item].actual;
                          $rootScope.planBody.campaign.networks.push($scope.netObject);
                        });
                      }
                    },
                    true
                  );
$rootScope.planBody.campaign.networks中填充了我在视图上更新的最后一个元素的副本。如果我选择4项,则第4项重复4次

当我调试并进入最终功能时

angular.forEach(validIndexArray, function(item,i){...});
我发现了一些奇怪的事情-在一次迭代之后,在我将$scope.netObject推入$rootScope.planBody.campaign.networks之后,当我重新进入循环时,在第一行:

$scope.netObject.keyid=newValue[item].keyid;
已在$rootScope.planBody.campaign.networks内推送的项目将使用新值更新。这是造成重复的原因

  • 我的代码是否有问题导致$digest不适用?我应该使用$apply吗
  • 如果是这样,这是理想的解决方案吗
  • 否则,有没有更好的方法来实现我的逻辑

  • 您正在更新现有(并已推送到数组中)对象的属性。
    您需要在每次迭代中创建一个新的空对象:

    angular.forEach(validIndexArray, function(item,i){
        $scope.netObject = {};
        ...
    });
    

    非常感谢。最愚蠢的错误!我已经更改了初始化,现在可以工作了