[解決済み] 巨大なデータセットに対するngRepeatのパフォーマンスを向上させる方法(angular.js)?
質問
数千行、各フィールド10個程度、2MB程度の巨大なデータセットがあります。これをブラウザで表示したいのですが、どうすればよいでしょうか?最も簡単な方法(データを取得し、それを
$scope
を使用します。
ng-repeat=""
は正常に動作しますが、DOMにノードを挿入し始めると、約半分の時間、ブラウザがフリーズします。この問題にどのようにアプローチすればよいのでしょうか?
1つの方法として、行を
$scope
を待ちます。
ngRepeat
を使用して、1 つのチャンクを DOM に挿入し終えてから次のチャンクに移動します。しかし、AFAIKでは、ngRepeatは"repeating"を終了したときに報告しないので、醜いことになります。
他の方法としては、サーバー上のデータをページに分割し、複数のリクエストでそれらを取得することもできますが、これはさらに醜いことです。
Angularのドキュメントに目を通し、以下のようなものを探しました。
ng-repeat="data in dataset" ng-repeat-steps="500"
しかし、何も見つかりませんでした。私はAngularの方法についてかなり新しいので、私が完全にポイントを逃している可能性があります。この場合のベストプラクティスは何ですか?
どのように解決するのですか?
私は @AndreM96 と同意見で、最良のアプローチは限られた量の行だけを表示することで、より速く、より良いUXになります。これはページネーションまたは無限スクロールで行うことができます。
Angularを使った無限スクロールは、以下のようにとても簡単です。 リミットトゥ フィルタを使用します。最初の制限を設定し、ユーザーがさらなるデータを要求したときに(私は簡単のためにボタンを使っています)、制限を増やせばよいのです。
<table>
<tr ng-repeat="d in data | limitTo:totalDisplayed"><td>{{d}}</td></tr>
</table>
<button class="btn" ng-click="loadMore()">Load more</button>
//the controller
$scope.totalDisplayed = 20;
$scope.loadMore = function () {
$scope.totalDisplayed += 20;
};
$scope.data = data;
以下は JsBin .
この方法は、携帯電話の場合、多くのデータをスクロールするときにラグが発生することが多いので、この場合はページ分割の方が適していると思います。
そのためには、limitToフィルターと、表示されるデータの開始点を定義するためのカスタムフィルターが必要です。
以下は JSBin をページネーションで表示します。
関連
-
元のイベントが実行されなかった後に要素を追加するためのjQueryソリューション
-
[解決済み】"フォームが接続されていないため、フォームの送信がキャンセルされました "というエラーの取得について
-
JavaScriptのStringに関する共通メソッド
-
nullのプロパティinnerHTMLを読み取れません エラーメッセージ
-
jq は html ページとデータを動的に分割する。
-
[解決済み] AngularJSのng-repeatでキーと値を反復処理する方法は?
-
[解決済み] .map()で要素を読み飛ばすには?
-
[解決済み】Angular.jsのセレクトボックスでデフォルトの選択肢を持つ方法
-
[解決済み】複数の引数でAngular.jsのフィルタを呼び出すには?
-
[解決済み] Angularでtransclude 'true'とtransclude 'element'を使用するタイミングは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
vueにおけるv-forループオブジェクトのプロパティ
-
Vueのクラススタイルの使い方の詳細
-
[解決済み】React - uncaught TypeError: 未定義のプロパティ 'setState' を読み取れない
-
[解決済み] TypeError: $.ajax(...) is not a function?
-
[解決済み】(Google Map API) Geocodeは以下の理由で成功しませんでした。REQUEST_DENIED
-
[解決済み】エラー。Ionic使用中にモジュール '../lib/utils/unsupported.js' が見つかりませんでした。
-
[解決済み】<select>で現在選択されている<option>をJavaScriptで取得するにはどうすればよいですか?
-
JavaScriptのStringに関する共通メソッド
-
[解決済み] 配列をチャンクに分割する
-
[解決済み】ng-repeatの終了イベント