Проблема с перезагрузкой Laravel Livewire и формы Bootstrap

Я вижу проблему с Livewire, когда использую ЛЮБУЮ форму Javascript. Используйте следующую форму: https://bbbootstrap.com/snippets/multi-step-form-wizard-30467045 (Хотя я пробовал другие формы, и это происходит со мной из-за событий wire: model из livewire)

Проблема в том, что WIRE: MODEL переводит меня в первый раздел, и я не могу использовать WIRE: IGNORE, потому что он переопределяет поведение, связанное с SELECT.

Во втором разделе я использую следующую связанную форму:

<div class="form-group">
  <label for="provincia">Provincia</label>
  <select wire:model="ubicacionSeleccionada" class="form-control" id="ubicacion">
       <option value=''>Seleccionar provincia</option>
       @foreach($ubicaciones as $ubicacion)
       <option value="{{$ubicacion->id}}">{{ $ubicacion->ubicacion }}</option>
       @endforeach                                          
  </select>
  </div>
                                        
    
   <div class="form-group">
   <label for="tipopropiedad">Localidad</label>
   <select wire:model="area" class="form-control" id="localidad
         {{ count($this->areas)== 0 ? 'hidden' : '' }} ">
         <option value=''>Seleccionar localidad</option>
         @foreach($this->areas as $area)
         <option value={{ $area->id }}>{{ $area->name }}</option>
         @endforeach
   </select>
   </div>

И это не позволяет мне использовать WIRE: IGNORE для прерывания событий.

Проблема в том, что любой WIRE: MODEL генерирует событие, которое принимает форму первого раздела. Вроде бы ОСВЕЖЕНИЕ

Кто-нибудь знает, как можно было бы использовать livewire без этого неудобства?

ИЗДАНИЕ

КНОПКА СЛЕДУЮЩИЙ ПРОСМОТР

<input type="button" name="next" class="next action-button" value="Continue" />

JAVASCRIPT

<script>
$(document).ready(function() {

    var current_fs, next_fs, previous_fs; //fieldsets
    var opacity;

    $(".next ").click(function() {

        current_fs = $(this).parent();
        next_fs = $(this).parent().next();

        //Add Class Active
        $(".progressbar li ").eq($("fieldset ").index(next_fs)).addClass("active ");

        //show the next fieldset
        next_fs.show();
        //hide the current fieldset with style
        current_fs.animate({
            opacity: 0
        }, {
            step: function(now) {
                // for making fielset appear animation
                opacity = 1 - now;

                current_fs.css({
                    'display': 'none',
                    'position': 'relative'
                });
                next_fs.css({
                    'opacity': opacity
                });
            },
            duration: 600
        });
    });

    $(".previous ").click(function() {

        current_fs = $(this).parent();
        previous_fs = $(this).parent().prev();

        //Remove class active
        $(".progressbar li ").eq($("fieldset ").index(current_fs)).removeClass("active ");

        //show the previous fieldset
        previous_fs.show();

        //hide the current fieldset with style
        current_fs.animate({
            opacity: 0
        }, {
            step: function(now) {
                // for making fielset appear animation
                opacity = 1 - now;

                current_fs.css({
                    'display': 'none',
                    'position': 'relative'
                });
                previous_fs.css({
                    'opacity': opacity
                });
            },
            duration: 600
        });
    });

    $('.radio-group .radio').click(function() {
        $(this).parent().find('.radio').removeClass('selected');
        $(this).addClass('selected');
    });

    $(".submit ").click(function() {
        return false;
    })

});

person maraet    schedule 25.08.2020    source источник


Ответы (2)


Livewire перезагружает компонент при изменении данных в форме. Компонент Livewire содержит всю форму, поэтому любые изменения, внесенные вашим javascript, будут забыты из-за потери состояния.

Вместо использования предоставленного JavaScript для изменений страницы используйте свойство Livewire, например selectedSection, и используйте его для определения того, какой раздел формы следует отображать. Это позволит вам поддерживать состояние формы при обновлении Livewire. Также используйте методы Livewire для обновления значения selectedSection при нажатии кнопок страницы.

person Ken    schedule 25.08.2020
comment
Я не хочу пользоваться вашей щедростью, но добавляю свою кнопку следующего просмотра и код javascript. Не могли бы вы привести мне пример? - person maraet; 25.08.2020
comment
Можете ли вы предоставить свой базовый компонент, представление и JavaScript в экземпляре phpsandbox.io? Это сэкономит мне массу времени и приведет к созданию кода, который можно будет использовать сразу. - person Ken; 25.08.2020

Вы можете использовать wire: model.lazy

  <div class="form-group">
  <label for="provincia">Provincia</label>
  <select wire:model.lazy="ubicacionSeleccionada" class="form-control" id="ubicacion">
       <option value=''>Seleccionar provincia</option>
       @foreach($ubicaciones as $ubicacion)
       <option value="{{$ubicacion->id}}">{{ $ubicacion->ubicacion }}</option>
       @endforeach                                          
  </select>
  </div>
                                        
    
   <div class="form-group">
   <label for="tipopropiedad">Localidad</label>
   <select wire:model.lazy="area" class="form-control" id="localidad
         {{ count($this->areas)== 0 ? 'hidden' : '' }} ">
         <option value=''>Seleccionar localidad</option>
         @foreach($this->areas as $area)
         <option value={{ $area->id }}>{{ $area->name }}</option>
         @endforeach
   </select>
   </div>
person Najmus Sakib    schedule 25.08.2020
comment
Здравствуйте, если я так использую, только выпадающий не работает, а с WIRE: IGNORE все равно перезагружает форму - person maraet; 25.08.2020