1

私はオブジェクトのコレクションを持っています。これは連想配列と呼ばれていると思います。とにかく、そのリストでアイテムを見つけて更新したいと思います。ちなみに、このコレクションは select の ng-model です。lodash にはこのタイプの機能がいくつかあることは知っています。アイテムを見つけることはできますが、アイテムを更新する最善の方法がわからないため、選択したデータ バインディングは引き続き機能します。

動作しない例を次に示します。

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

2 に答える 2

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;
  }
}

デモ1

または、使用しているためlodash、おそらくコード行が少なくなります:-

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

デモ2

angular.extendプロパティを更新しても、基になるソースオブジェクト参照が同じままであることを確認します。 lodash を使用することもできますmerge

于 2014-10-15T23:53:35.747 に答える