如何在不破坏角度数据绑定的情况下更新集合中的项目?

时间:2014-10-15 23:14:51

标签: javascript angularjs angularjs-scope lodash angularjs-ng-options

我有一组对象,我认为这称为关联数组。无论如何,我想在该列表中找到一个项目并进行更新。作为旁注,这个集合是选择的ng模型。我知道lodash有一些这类功能。我可以找到该项目,但我不确定更新项目的最佳方法是什么,因此数据绑定仍适用于我的选择。

这是一个不起作用的例子:

for (x = 0; x < $scope.RulesTemplates.length; x++)
 {
   if($scope.RulesTemplates[x].Name == $scope.TempRules.Name)
   {
     $scope.RulesTemplates[x] = $scope.TempRules;
   }
 }

2 个答案:

答案 0 :(得分:2)

假设有一个样本数据集,如果要扩展绑定到ng-options的数组中的现有对象,首先需要确保该角度具有由特定唯一属性跟踪的数组项。然后您可以在相应位置更新数组中的新项目,angular将自动在绑定选择选项中执行更新(无需重新呈现其他选项值)。但是这种方法可能无法刷新已绑定的ng-model。

使用传统循环的另一种简单方法: -

<select ng-options="item.display for item in items" ng-model="selected"></select>

您的更新逻辑可以是: -

for (x = 0, l = $scope.items.length; x < l; x++){
  var item = $scope.items[x];
  if(item.name == itemsUpdate.name) {
      angular.extend(item,itemsUpdate); //Extend it
      break;
  }
}

<强> Demo1

或者因为您使用的是lodash,所以代码行可能更少: -

var item = _.first($scope.items, {name:itemsUpdate.name}).pop(); //Get the item add necessary null checks
angular.extend(item, itemsUpdate);

<强> Demo2

angular.extend将确保基础源对象引用与更新属性保持一致,您也可以使用lodash merge

答案 1 :(得分:1)

尝试这样的事情:

angular.forEach($scope.RulesTemplates, function(value, key){
    if(value.Name == $scope.TempRules.Name){
        value = $scope.TempRules;
    }
})

angular.forEach