$ scope里面的angular.forEach()。$ watch表现得很奇怪 - 吐出重复的东西

时间:2014-07-01 21:09:05

标签: angularjs foreach apply watch digest

我正在设置$ 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;

推送项目ALREADY PUSHED INSIDE $ rootScope.planBody.campaign.networks使用新值进行更新。这导致重复。

  1. 我的代码有什么问题导致$ digest不适用?我应该使用$ apply吗?
  2. 如果是理想的解决方案呢?
  3. 如果不是,是否有更好的方法在角度中实现我的逻辑?

1 个答案:

答案 0 :(得分:1)

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

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