【问题标题】:Select2 v4 how to paginate results using AJAXSelect2 v4 如何使用 AJAX 对结果进行分页
【发布时间】:2015-12-08 14:56:09
【问题描述】:

我正在尝试使用 Select2 4.0 对结果进行分页(每 25 行),但我不知道如何实现。有人知道怎么做吗?

如果用户到达 25 行的末尾,如果还有更多行,我想加载并显示它。

这是我的 HTML 模板

<div class="form-group">
    {!! Form::select('breed_id', $breeds, null, ['class' => 'form-control', 'id' =>'breed_id'] ) !!}
</div>

这里是 Select2 的 JavaScript。

$("#breed_id").select2({
    placeholder: 'Breed...',
    width: '350px',
    allowClear: true,
    ajax: {
        url: '',
        dataType: 'json',
        data: function(params) {
            return {
                term: params.term
            }
        },
        processResults: function (data, page) {
            return {
                results: data
            };
        },
        cache: true
    }
});

这是我的控制器代码

if ($request->ajax())
{
    $breeds = Breed::where('name', 'LIKE',  '%' . Input::get("term"). '%')->orderBy('name')->take(25)->get(['id',DB::raw('name as text')]);

    return response()->json($breeds);
}

当我尝试输入 params.page 时,它会显示“未定义”。

【问题讨论】:

    标签: jquery laravel jquery-select2 jquery-select2-4


    【解决方案1】:

    Select2 在通过来自processResultspagination 键使用远程数据时支持分页。

    对于无限滚动,pagination 对象应该有一个 more 属性,它是一个布尔值(truefalse)。这将告诉 Select2 在到达底部时是否应该加载更多结果,或者是否已经到达结果的末尾。

    {
      results: [array, of, results],
      pagination: {
        more: true
      }
    }
    

    在您的情况下,您有能力塑造自己的结果。因此,您实际上可以更改 JSON 响应以匹配预期格式,这意味着您甚至不需要使用 processResults

    如果修改ajax.data函数返回,Select2可以将页码作为page传入。

    data: function(params) {
        return {
            term: params.term || "",
            page: params.page || 1
        }
    },
    

    然后您将能够使用Input::get('page') 获取该页面。您可以使用(page - 1) * resultCount 计算要跳过的结果总数,其中resultCount 在您的情况下是25。这将允许您修改查询以组合 LIMITOFFSET 以获得您需要的结果。

    $page = Input::get('page');
    $resultCount = 25;
    
    $offset = ($page - 1) * $resultCount;
    

    您可以使用以下查询生成LIMIT / OFFSET 查询(基于this Stack Overflow question

    $breeds = Breed::where('name', 'LIKE',  '%' . Input::get("term"). '%')->orderBy('name')->skip($offset)->take($resultCount)->get(['id',DB::raw('name as text')]);
    

    所以现在$breeds 将只包含请求的结果。剩下要做的就是调整响应以匹配 Select2 的预期。您可以通过检查结果总数并查看是否超出限制来确定是否还有更多页面。

    $count = Breed::count();
    $endCount = $offset + $resultCount;
    $morePages = $endCount > $count;
    

    所以现在$morePages 应该是一个布尔值,这正是 Select2 在 pagination.more 中寻找的。现在您只需要调整响应以匹配我之前提到的格式。

    $results = array(
      "results" => $breeds,
      "pagination" => array(
        "more" => $morePages
      )
    );
    

    然后渲染它

    return response()->json($results);
    

    把所有东西放在一起,你就得到了 JavaScript

    $("#breed_id").select2({
        placeholder: 'Breed...',
        width: '350px',
        allowClear: true,
        ajax: {
            url: '',
            dataType: 'json',
            data: function(params) {
                return {
                    term: params.term || '',
                    page: params.page || 1
                }
            },
            cache: true
        }
    });
    

    以下内容适用于您的控制器

    if ($request->ajax())
    {
        $page = Input::get('page');
        $resultCount = 25;
    
        $offset = ($page - 1) * $resultCount;
    
        $breeds = Breed::where('name', 'LIKE',  '%' . Input::get("term"). '%')->orderBy('name')->skip($offset)->take($resultCount)->get(['id',DB::raw('name as text')]);
    
        $count = Breed::count();
        $endCount = $offset + $resultCount;
        $morePages = $endCount > $count;
    
        $results = array(
          "results" => $breeds,
          "pagination" => array(
            "more" => $morePages
          )
        );
    
        return response()->json($results);
    }
    

    【讨论】:

    • 哇,你真的很摇滚!!我只需要改变两件事... $morePages = $count > $endCount;并且计数必须根据输入 $count = Count(Breed::where('name', 'LIKE', '%' . Input::get("term"). '%')->orderBy ('name')->get(['id',DB::raw('name as text')]));非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2017-07-02
    • 2018-01-17
    • 2017-04-19
    • 2019-06-24
    • 1970-01-01
    相关资源
    最近更新 更多