Как добавить функциональность «Загрузить больше» в Select2 bootstrap с возможностью поиска для Jquery, используя красноречивую разбивку на страницы из Laravel?

#php #jquery #laravel

#php #jquery #laravel

Вопрос:

Я смог реализовать выпадающий список с возможностью поиска благодаря помощи select2 bootstrap. Если я нажму на выпадающий список, в первой строке появится панель поиска, где я мог бы ввести имя пользователя, и в то же время я мог бы вручную выбрать его, прокручивая вниз.

Однако, если данные уже достигли 3000, выпадающий список отображается до самого низа, что выглядит беспорядочно. Итак, чтобы привести в порядок вещи, я хотел бы ограничить отображаемых пользователей только 10, а последняя строка — «Загрузить больше …». Если я прокрутил полосу прокрутки в нижней части, она должна загрузить следующие 10, что делается путем получения следующих 10 пользователей из UsersController. Я использую нумерацию страниц из контроллера, поэтому у меня нет проблем с этим.

Моя проблема в том, как я могу определить, что полоса прокрутки достигает дна, чтобы я мог указать начальной загрузке select2 загружать следующих 10 пользователей? Загрузчик select2 создает панель поиска и выпадающий список с возможностью прокрутки динамически, если я нажимаю выпадающий список, и я не могу понять, как я могу определить, достигла ли полоса прокрутки уже нижней.

users.blade.php

 @section('script')
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.2/jquery.validate.js" defer></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.2/localization/messages_ja.js" defer></script>
    <link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-beta.1/dist/css/select2.min.css" rel="stylesheet" defer/>
    <link href="https://cdn.jsdelivr.net/npm/@ttskch/select2-bootstrap4-theme@1.3.4/dist/select2-bootstrap4.min.css" rel="stylesheet" defer/>
    <script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-beta.1/dist/js/select2.min.js" defer></script>
    <script type="module" defer>
        $(document).ready(function () {

            $.ajaxSetup({
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                }
            });

            let setUserSelectList = function (data) {
                let $sel = $('#userId');
                $sel.children('option:gt(0)').remove();
                
                $.each(data, function (index, value) {
                    let status = !value.is_active ? ' ('   value.status_name   ')' : '';
                    $sel.append('<option value="'   value.id   '">'   value.name   status   '</option>');
                });

                $sel.append('<option>'   'Load more...'   '</option>');

                $sel.select2({
                    data: data,
                    theme: 'bootstrap4'
                });

                return $sel;
            };

            $('#create-meter').click(function () {
                $.when(
                    $.get('user/select-list', function (data) {
                        setUserSelectList(data);
                    })
                ).done(function() {
                });
            });
        });
    </script>
@endsection

@section('content')
<div class="container">
     <div class="row mt-1 col-sm-10">
        <a href="javascript:void(0)" class="btn btn-primary " id="create-meter">Fetch Users</a>
        <label for="userId" class="col-sm-1 col-form-label">Name:</label>
        <div class="col-sm-2">
            <select class="form-control" id="userId" name="user_id" required>
            </select>
        </div>
    </div>
</div>
 

UsersController.php

 public function listForSelect()
{
    // $userList = User::paginate(4); //I wanted to implement this  
    $userList = User::all();  
    return response()->json($userList);
}
 

Комментарии:

1. Выберите раскрывающийся список select2 и прикрепите к нему событие прокрутки, также был бы полезен минимальный пример html / CSS / js

2. @Ainz-sama спасибо за ответ, я снова обновил его и добавил HTML-часть. Код действительно огромен, поэтому я просто нарезал необходимые части здесь