【发布时间】:2014-07-02 05:51:50
【问题描述】:
我正在使用以下代码在包含嵌套项的数组上设置 $scope.$watch:
$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 逻辑?
【问题讨论】:
标签: angularjs foreach apply watch digest