9

連絡先のリストを表示し、それらをフィルタリングできるようにするために、優れたアイソトーププラグインを使用することを計画しています。私が抱えている問題は、それが小さなデータセットに対してはうまく機能するということですが、1000以上のデータに対してそれをスケールアップする最良の方法がわかりません。

これまでのところ、私が持っていたアイデアは次のとおりです。

  • ランダムなサブセットをロードし、フィルターをクリックしてギャップを埋めるときにノードを追加します
  • ユーザーがスクロールするにつれて、より多くのノードをロードする
  • 結果のページング
  • 数値を事前定義されたしきい値未満にするのに十分なフィルターが選択されるまで、連絡先を表示しません。

これらがうまくいくかどうかはわかりませんが、他の人がこの状況に直面し、私にいくつかのアイデアを与えることができることを望んでいました。

4

3 に答える 3

7

あなたが説明する状況はかなり一般的です:ユーザーが一度に詳細に見ることができるよりも多くのデータにアクセスできるようにする方法。

質問に答えるにはいくつかの方法があり、正解は完全に主観的です。それは、ユーザーが連絡先を何を見ようとしているのか、または何をしようとしているのかによって異なります。本当に満足のいく解決策を得る前に、ユーザーが連絡先を何に使用するのかを知る必要があります。

推測するだけで(しかし、あなたは私よりもよく知っているでしょう!)、彼らがしていることは2つあると思います。

  • ルックアップ:特定の連絡先を探していて、彼らはすでに自分の名前/ハンドルを知っています。
  • 探索:特定の連絡先を探していますが、名前/ハンドルを完全に思い出せません。または、彼らはただ閲覧しているだけです。

すべてのソリューションに対してフィルタリングを行う場合、ルックアップの目標はほとんど問題になりません。探索の目標は、次の目的で設計することです。

  • ランダムサブセット:基本的に参照するサブセットが残っているため、参照するのに最適な方法ではありません。新しいものを表示するには、明示的にフィルタリングする必要があります。探しているものが正確にわからない場合は、フィルタリングが困難です。
  • 無限スクロール:最近人気のあるソリューションのようです。特に、1000以上の連絡先を「無限に」スクロールしている場合は、面倒だと思います。おそらく、Exploreの目標には適していません。
  • ページング:これも面倒ですが、ページングがアルファベット順の並べ替えに関連付けられている場合は、これでうまくいく可能性があります。
  • しきい値の制限:それで...単にフィルタリングに依存していますか?これは、ユーザーが1つのフィルターを適用しても、しきい値に達していないb / cが何も表示されない場合には、悪い場合があります(Johnsonという名前の人がたくさんいる可能性があります。これがあなたの名前です。検索)。また、何を探しているのかわからないときは、閲覧できることが重要だと思います。

私があなたの立場にあったら、連絡先のクラスタリングを紹介したいと思います。1000以上の連絡先がパフォーマンスの問題の多くであるとは思えないので(100万以上の話をしているとは言えません!)、10000以上は実際にはユーザーの制約です。つまり、一度に1000以上の連絡先を表示することはできません。

おそらくラストネームまたはラストネームとファーストネームでクラスタリングを導入することをお勧めします。次に、1つのクラスターにドリルダウンする方法をユーザーに提示しますが、他のすべての連絡先を折りたたんで、すぐに表示されないようにします。アコーディオン/ロロデックスパラダイムの連なりの何か。これにより、ユーザーは「すべての連絡先」を操作しているように見せることができます。おそらく、クラスターごとに最小数を導入して、クラスターが十分に小さい場合にわざわざ表示しないようにします(つまり、2、3、または5の連絡先のクラスターを表示する理由-連絡先を表示するだけです)。次にフィルターを適用すると、クラスターが溶けてしまいます。

于 2012-02-13T13:47:30.023 に答える
1

多数の同位体アイテムを追加および配置するときにパフォーマンスの低下を経験していました。これは、アイテムをバッチではなく段階的に追加していたためです。それは当然の選択のはずですが、私が見落としていたものです。

個別にロードまたは削除するのではなく、要素の配列またはリストを必ず使用してください。

incomingData=['<div>a</div>','<div>b</div>'];
elements=[];

jQuery.each(incomingData,function(ind,val){
    var element = jQuery(val).get(0);
    //$container.isotope('insert', element); //resource heavy
    elements.push(element); 
});

$container.isotope( 'insert', elements ); //less processing
于 2015-02-11T18:30:58.393 に答える
1

Read Through Cache のアイデアを採用すると、次のようになります。

  • 最大 100 (または構成可能な数) の要素のバッチをロードできるメソッドを作成します。それは:
    • フィルタリングされた項目をキャッシュ (要素の ID を主キーとする JS 配列) で検索します。
    • フィルタリングされたアイテムを AJAX でリクエストする
    • AJAX によって返されたアイテムはキャッシュに追加されます
    • AJAX によって返された項目は、DOM の下部にある「読み込み」領域 (以下を参照) にも追加され、作成された DIV の ID が要素の主キーになります。
    • サーバーは最大 100 個の要素を送信します。フィルタがない場合は、まだ送信されていない次の要素が送信されます。ロードされた要素を追跡する必要があります。サーバー側 (つまり、セッション) でキャッシュされたデータのサイズが重要な場合、最大の連続送信 ID のみを追跡できます (つまり、最初のバッチ ID 1、2、3、6、9、10 を送信した場合、最高の ID は 3 であるため、次回は 4 から送信することになるため、セッションで 1 つの値のみを保持します)
  • キャッシュされた DIV をアイソトープ コンテナとの間で移動できるメソッドを作成する
  • 上記のメソッドを使用して onDomReady をロードし、最初の 20 個の要素を自然な順序で表示します (この場合、名前のアルファベット順になります)。20要素、50要素、または任意の要素にすることができます...
  • バックグラウンドで、AJAX によるループと 100 個のすべての要素のバッチでロードします。

ローディングエリアは単純に次のようになります。

<html>
  <body>
    <!-- the page stuff -->
    <div id="loader" style='display:none'>
      <!-- all elements are loaded here -->
      <div class="item">...</div>
    </div>
  </body>
</html>

このようにして、すべての要素を段階的に DOM にロードし、必要なものだけを表示することができます。

于 2012-02-11T14:51:03.563 に答える