Живой фильтр в Laravel

#php #jquery #laravel #filter #laravel-blade

Вопрос:

У меня есть форма, которая выглядит так, как показано ниже. У меня есть три «белых» выпадающих списка для фильтрации значения для выпадающего списка тегов регистрации оборудования ( значения раскрывающегося поля ввода, в котором указана метка тега регистрации оборудования, будут отображаться только после того, как пользователь выберет значения для трех «белых» выпадающих списков). Таким образом, значения тегов регистрации оборудования будут отличаться в зависимости от значения выпадающего списка «белый».

введите описание изображения здесь

Я хочу, чтобы это был живой фильтр, параметры выпадающего списка будут немедленно меняться каждый раз, когда пользователь выбирает значение выпадающего списка «белый». В настоящее время мой подход заключается в использовании onchange=" this.form.submit()" атрибута в раскрывающихся списках «белый» и возврате значений после фильтра, но я понимаю, что у этого метода есть недостаток, который заключается в том, что пользователь может случайно отправить форму при изменении значения раскрывающихся списков «белый». Как я могу предотвратить это и разрешить пользователям отправлять форму только нажатием кнопки «Сохранить»?

     $this->Calibration_Location = $request->get('selected_location');
    $this->Calibration_Category = $request->get('selected_category');
    $this->categories = Equipment::select('Category')->distinct()->get()->toArray();
    $this->locations = Equipment::select('Location')->distinct()->get()->toArray();
    $matchThese = ['Category' => $this->Calibration_Category, 'Location' => $this->Calibration_Location];
    $this->Registration_Select_Tags = Equipment::select('Registration Tag')->distinct()->where($matchThese)->get();
 

Я также пробовал jQuery, но я могу запускать только по указанному раскрывающемуся полю, а не по любому из них.

 <script type="text/javascript">
        $(document).ready(function() {
            var location, category
            $('#selected_transfer_location').change(function() {
                location = $(this).val();
                console.log(location);
                $('#selected_transfer_category').change(function() {
                    category = $(this).val();
                    console.log(category);
                });

                // $('#transfer_registration_tag').find('option').not(':first').remove();

                $.ajax({
                    url: 'Transaction/'   location   '/'   category,
                    type: 'get',
                    dataType: 'json',
                    success: function(response) {
                        var len = 0;
                        if (response.data != null) {
                            len = response.data.length;
                        }

                        if (len > 0) {
                            for (var i = 0; i < len; i  ) {
                                var id = response.data[i]['Registration Tag'];
                                var name = response.data[i]['Registration Tag'];

                                var option = "<option value='"   id   "'>"   name  
                                    "</option>";

                                $("#transfer_registration_tag").append(option);
                            }
                        }
                    }
                })
            });

        });

    </script>
 

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

Ответ №1:

Первый подход может заключаться в том, что вы используете вызов ajax-запроса при изменении каждого из них и извлекаете отфильтрованные результаты. Что-то вроде этого:

 $('#dropdown1, #dropdown2, #dropdown3').change(function(){
    var val1 = $('#dropdown1').val();
    var val2 = $('#dropdown2').val();
    var val3 = $('#dropdown3').val();

    //And then your ajax call here to fetch filtered results.
});
 

Единственная проблема в том, что этот вызов Ajax будет выполняться минимум 3 раза, по одному для каждого из них.

Второй подход может заключаться в том, что вы даете небольшую кнопку под этими выпадающими списками, что-то вроде тегов выборки. Когда пользователь выберет все 3 значения, он нажмет на эту кнопку, и вы вызовете свой ajax onClick этого btn. Так что ваш Ajax будет вызван только один раз.

Ответ №2:

Для этого вы можете использовать livewire. Это просто. Чтобы установить его, вы должны использовать composer, записав на пленку команду fowllowing: composer req livewire/livewire

Пожалуйста, ознакомьтесь с этим руководством, чтобы узнать, как сделать то, что вы хотите сделать, используя фреймворк.

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

1. Мне любопытно, действительно ли это хороший подход для смешивания livewire с REST и контроллерами? ( Все еще новый, извините, если мой вопрос странный )

2. Я думаю, что это не так, если вы используете ОТДЫХ. Я сожалею о своем первом ответе так. Livewire полезен только под TALL стеком (Попутный ветер Альпийский Laravel Livewire)