1

さて、それで私はもう少し具体的になります(私の最後の質問以来)。

基本的に、ページ付けページがあります。表示カテゴリは3つありますが、ページ付けページごとに表示されるアイテムは50個だけです。したがって、1ページを占める単一のカテゴリすべて、または異なるカテゴリの組み合わせを取得できますが、1ページあたり50アイテムを超えることはできません。新しいカテゴリに到達すると、ヘッダーが表示され、次に関連するアイテムが表示されます。各カテゴリをリクエストするためのajax呼び出しに追加する数学を理解するのに苦労しています。たとえば、リネンを検索するとします。そして、以下に示すように、3つのカテゴリにまたがる合計329の一致を取り戻すとしましょう。これで、いくつかのデータが返されるので、一度に50個のアイテムしか照会しませんが、特定のことを前もって知ることができます。

A.リネンを検索する:

ベースデータ

Total Items: 129
Category1 has 111 items
Category2 has 101 items
Category3 has 17 items

したがって、1ページ目に次のように表示されます。

CATEGORY 1 HEADER
... list of the 50 items ...

B.ユーザーが[次へ]をクリックすると(まだカテゴリ1のしきい値にあるため)、2番目の50のセットが表示されます。

2ページ:

CATEGORY 1 HEADER
List of next 50 items

C.ユーザーが[次へ]をクリックします(カテゴリ1の合計を壊したので、カテゴリ2に到達します)。

ページ3:

CATEGORY 1 HEADER
List of 11 items

CATEGORY 2 HEADER
List of 39 category 2 items

等..

私が抱えている問題は、大量のif / else / || / &&などを実行しなくても、範囲を指定できる優れたアルゴリズムがあるため、「次の」ページをクリックすると、ajaxparamsリクエストの範囲を指定できます。バックエンド。

つまり、次の3番目のページで-をクリックします(上記のように、category1とcategory 2の両方があります)。完璧な世界では、私のAjaxは2つの呼び出しを実行します。1つはカテゴリ1用、もう1つはカテゴリ2用です。もちろん、50匹のリストが3匹の猫すべてに完全にまたがっている場合、3回の呼び出しが行われます。

/category1?rows=11&start=101
/category2?rows=39&start=1

そんな感じ。したがって、101の開始で最初のajax呼び出しから11個のアイテムが必要なことはわかっています。バックエンドは、範囲が101〜111などであることを認識していると思います。

私はここで私のニーズを満たすのに十分簡潔であることを願っています。解決策は非常に数学的なようです。

私は物事を鉛筆で書くだけの線に沿って働いていました...

(category1-(max x(currPage-1))/ max> =1->trueの場合は50カテゴリ1を要求します。

(category1-(max x(currPage-1))/ max <1->モジュラス量を要求してから、category2に入る

jqueryを使用します。

4

1 に答える 1

1

1つの解決策はhttp://jsfiddle.net/CrossEye/eKApZ/で入手できます。

基本的な考え方は次のとおりです。

var createCategoryRangesForPage = (function() {
    var ranges = function(itemCounts) {
        var total = 0;
        var indices = [0].concat(jQuery.map(itemCounts, function(item) {
            return total = total + item.count;
        }));
        var result = function(pageNbr, pageSize) {
            var first = pageSize * (pageNbr - 1),
                last = Math.min(first + pageSize, total),
                firstIdx = indices.length - 1,
                lastIdx = indices.length - 1;
            if (first >= total) {return ranges.OUT_OF_BOUNDS;}
            while (indices[firstIdx] > first) {firstIdx--;}
            while (indices[lastIdx] >= last) {lastIdx--;}
            return jQuery.map(new Array(lastIdx - firstIdx + 1), function(item, idx) {
                var index = idx + firstIdx;
                return {
                    name: itemCounts[index].name,
                    start: Math.max(first, indices[index]) - indices[index] + 1,
                    // end: Math.min(last, indices[index + 1]) - indices[index],
                    count: Math.min(last, indices[index + 1]) - Math.max(first, indices[index])
                };
            });
        };
        result.OUT_OF_BOUNDS = ranges.OUT_OF_BOUNDS;
        return result;
    };
    ranges.OUT_OF_BOUNDS = {message: "Out of bounds", toString:function(){return this.message;}};
    return ranges;
}());

次に、次のようなページ付け関数を作成できます。

var catRangesForPage = createCategoryRangesForPage([
    {name:"CATEGORY 1", count: 111},
    {name:"CATEGORY 2", count: 101},
    {name:"CATEGORY 3", count: 17}
]);

そして、たとえば、次のように、ページサイズが50の3ページを呼び出します。

catRangesForPage(3, 50)

次のような結果を得るには:

[
    {
        "name": "CATEGORY 1",
        "start": 101,
        "count": 11
    },
    {
        "name": "CATEGORY 2",
        "start": 1,
        "count": 39
    }
]

これを使用して、AJAX呼び出しを生成できます。

pageSize必要に応じて、パラメーターを最初の呼び出しに移動するのは簡単です。これは柔軟性が劣りますが、少し使いやすいかもしれません。これを変更するには、次のpageSize行からパラメータを移動するだけです。

        var result = function(pageNbr, pageSize) {

これに:

    var ranges = function(itemCounts) {

itemCounts(私のサンプルのようにオブジェクトリテラルを渡すと、シャッフルで失われる可能性があるため、おそらくここで最初のパラメーターになるはずです。)

もう1つの注意点は、関数が、OUT_OF_BOUNDS範囲外のページにアクセスしようとしたことを通知するという名前のシグナルオブジェクトを返すことです。そのオブジェクトは、ジェネレーター関数とそれが返す関数のどちらか便利な方に名前空間が付けられます。

これはあなたの最初の問題の範囲外でテストされていません、そして私はそれのどこかに境界の問題を見つけてもそれほど驚かないでしょう。

(これはjQueryを使用しますが、そのユーティリティ関数にのみ使用されます。最近のブラウザのネイティブ実装を含め、map適切な実装を使用できます。)map

頑張ってください!

于 2012-10-15T02:06:10.103 に答える