Принудительная перезагрузка полной страницы в Livewire

#laravel #laravel-livewire #alpine.js

#laravel #laravel-livewire #alpine.js

Вопрос:

Я использую Livewire и Alpine с Laravel 8.

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

Однако библиотеку Datatable гораздо сложнее использовать с Livewire, поэтому я решил использовать всю Datatable в <div> wire:ignore атрибуте with .
Из-за этого, если я хочу обновить таблицу данных после внесения изменений, я не могу использовать магию $refresh , потому что таблица данных в настоящее время находится внутри wire:ignore .

Итак, я думал о полной перезагрузке страницы после завершения редактирования, но я не понял, как это сделать, return redirect()->back() не работает…

Вот как save выглядит мой метод, который вызывается при выполнении редактирования из модального:

 public function save()
{
    MyModel::where('id', $this->edited_id)->update([...]);
    $this->clearSelection();
    return redirect()->back(); // This is not working
}
  

И это моя таблица:

 <div wire:ignore>
    <table class="dt-table table">
        <thead>
            <tr>
                <th>Actions</th>
                <th>id</th>
                <th>name</th>
                <th>other</th>
            </tr>
        </thead>
        <tbody>
            @foreach ($models as $m)
                <tr>
                    <td>
                        <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#mymodal">Edit</button>
                    </td>
                    <td>{{ $m->id }}</td>
                    <td>{{ $m->name }}</td>
                    <td>{{ $m->somedata }}</td>
                </tr>
            @endforeach
        </tbody>
    </table>
</div>
  

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

1. попробуйте location.reload();

2. @KamleshPaul Вы имеете в виду вызов Javascript для инициализации перезагрузки страницы. Интересно, есть ли решение непосредственно внутри компонента Livewire (в PHP), например, redirect () или что-то в этом роде

Ответ №1:

Livewire сохраняет исходный URL-адрес в Referer заголовке. Вы можете использовать его для обновления страницы:

 return redirect(request()->header('Referer'));
  

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

1. Нравится это решение

Ответ №2:

Убедитесь, что вы используете Livewire версии 2.x.x, и вы сможете ознакомиться с документами здесь:

https://laravel-livewire.com/docs/2.x/redirecting

Компонент Livewire:

 class ContactForm extends Component
{
    public $email;

    public function addContact()
    {
        Contact::create(['email' => $this->email]);

        return redirect()->to('/contact-form-success');
    }
}
  

Шаблон компонента Livewire

 <div>
    Email: <input wire:model="email">

    <button wire:click="addContact">Submit</button>
</div>
  

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

1. Значит, я должен перенаправить на себя?

2. ДА. Обычно я просто перенаправляю на ту же страницу.

Ответ №3:

В представлении, включающем компонент валюты

 @livewire('nav-cart',['page'=>request()->fullUrl()])
  

Затем в компоненте метод монтирования

 public function mount($page)
    {

        $this->page = $page;
  

создайте общедоступное свойство $page, а затем после изменения валюты

 return redirect($this->page);