サーバーから取得した JSON 配列のデータを含むテーブル行で ng-repeat を使用しています。私の目標は、アイテムがサーバー上で追加、削除、または変更されるたびに、変更されていないアイテムに影響を与えることなく、リストを自動的に更新することです。最終的な実装では、これらのテーブル行には、更新をサーバーに送り返すための双方向にバインドさ<input>
れた要素も含まれます。<select>
要素で使用可能なオプションの一部は、<select>
変更される可能性のある別のリストからの ng-repeat ディレクティブを使用して生成されます。
これまでのところ、新しいアレイがサーバーから送信されるたびに (現在は 2 秒ごとにポーリングされます)、ng-repeat リスト全体が削除され、再生成されます。これは、テキストの選択を妨げ、入力フィールドがユーザーによって現在編集されていても破壊され、おそらく必要以上に遅く実行されるため、問題があります。
jQuery と DOM 操作を使用して、自分のやりたいことを実行する他の Web アプリを作成しましたが、コードは非常に複雑になり、開発には時間がかかります。AngularJS とデータ バインディングを使用して、コードと時間のほんの一部でこれを達成したいと考えています。
ここで質問があります:バッキング配列をこのように更新することは可能ですが、実際に変更されたアイテム/プロパティに対応する DOM 要素のみを変更することはできますか?
これは、タイマーでハードコードされた配列を使用して定期的なポーリングをシミュレートする最小限のテスト ケースです ( http://jsfiddle.net/DWrmP/でライブを参照してください)。要素が削除されて再作成されるため、テキスト選択が 500 ミリ秒ごとにクリアされることに注意してください。
HTML
<body ng-app="myApp">
<table ng-controller="MyController">
<tr ng-repeat="item in items | orderBy:'id'">
<td>{{item.id}}</td>
<td>{{item.data}}</td>
</tr>
</table>
</body>
JavaScript
angular.module('myApp', []).controller(
'MyController', [
'$scope', '$timeout',
function($scope, $timeout) {
$scope.items = [
{ id: 0, data: 'Zero' }
];
function setData() {
$scope.items = [
{ id: 1, data: 'One' },
{ id: 2, data: 'Two' },
{ id: 5, data: 'Five' },
{ id: 4, data: 'Four' },
{ id: 3, data: 'Three' }
];
$timeout(setData, 500);
}
$timeout(setData, 500);
}
]
);