#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);