34

サーバーから取得した 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);
        }
        ]
);
4

3 に答える 3

38

Google からこれを見つけた人のために、以下のページで、この問題に役立つ AngularJS 1.2 の機能について説明しています。

http://www.bennadel.com/blog/2556-Using-Track-By-With-ngRepeat-In-AngularJS-1-2.htm


追加する編集:リンクが切れた場合に備えて、リンクされた投稿からの最も重要な文:

新しい "track by" 構文を使用して、JavaScript オブジェクトを DOM ノードに関連付けるために使用するオブジェクト プロパティ (またはプロパティ パス) を AngularJS に伝えることができるようになりました。これは、"track by" 関連付けがまだ機能している限り、DOM ノードを破壊することなく JavaScript オブジェクトを交換できることを意味します。

于 2014-01-15T21:18:10.313 に答える
0

次のソリューションは、まだ製品のバックログにありますが、最終的には自分で構築する予定です。

ng-repeat の問題は、必要に応じて DOM からアイテムを削除することです。テーブルの場合、サイズ変更などを意味しますが、データが動的である場合、データが変更され、テーブルのサイズが変更されるため、ちらつくことがあります。シフトしています。特にページング中は、ページ全体がまだロードされていない可能性があるためです。

このちらつきを回避するには、テーブルの行数を変更しないでください。代わりに、「表示された」データの ng-repeat を用意し、配列に項目を追加または削除することなく、必要に応じて変更します。

于 2016-04-17T04:45:17.437 に答える