#laravel-livewire
Вопрос:
Когда я настраиваю datatable, независимо от объекта, который я использую, я заканчиваю тем, что он пытается загрузиться и в конечном итоге истекает время ожидания. Я даже не знаю, как начать отладку этого.
Я следовал некоторым примерам здесь: https://livewire-datatables.com/ и простые таблицы данных, такие как:
<livewire:datatable model="AppUser" exclude="planet_id, bio, latitude, longitude, updated_at" />
Отлично работает. Проблема, с которой я сталкиваюсь, заключается в том, что я пробую все, что требует собственного класса Datatable.
Мои шаги/код следующие:
php artisan livewire:make jobs-data-table
jobs-data-table.blade.php
<livewire:jobs-data-table searchable="title" exportable />
Возможность трудоустройства
<?php
namespace AppHttpLivewire;
use AppModelsJob;
use LivewireComponent;
use IlluminateSupportStr;
use IlluminateSupportCarbon;
use IlluminateSupportFacadesDB;
use MediconesystemsLivewireDatatablesColumn;
use MediconesystemsLivewireDatatablesDateColumn;
use MediconesystemsLivewireDatatablesTimeColumn;
use MediconesystemsLivewireDatatablesNumberColumn;
use MediconesystemsLivewireDatatablesBooleanColumn;
use MediconesystemsLivewireDatatablesHttpLivewireLivewireDatatable;
class JobsDataTable extends Component
{
public function builder()
{
return
Job::query()->take(10)->get(2);
}
}
Затем я настроил простой тестовый маршрут:
Route::get('/test', function () {
return view('/livewire/jobs-data-table');
});
Маршрут работает, но в конечном итоге истекает время ожидания, без ошибок, выходящих за рамки исключения тайм-аута.
Ответ №1:
Вы создаете бесконечный цикл — заставляя компонент визуализировать себя снова и снова.
Ваш маршрут вызывает представление livewire/jobs-data-table.blade.php
, а представление вызывает JobsDataTable
компонент через <livewire:jobs-data-table ../>
. Это вернет новый экземпляр представления livewire/jobs-data-table
, который снова инициализирует JobsDataTable
компонент и продолжит этот цикл до истечения времени ожидания.
Обычно при рендеринге полностраничного компонента Livewire вы вызываете класс в маршруте, а не непосредственно представление, таким образом, вы визуализируете весь компонент, а не только представление, что означает, что использование render()
любых представлений в livewire
папке является плохой практикой.
Route::get('/test', AppHttpLivewireJobsDataTable::class);
Однако это не решит вашу проблему, это ничего не изменит. Вам нужно отрисовывать компонент один раз.
Чтобы решить вашу проблему, вам нужно отрисовывать компонент таким образом, чтобы он не вызывал сам себя в представлении. Это означает, что ваше livewire/jobs-data-table.blade.php
представление не может вызывать <livewire:jobs-data-table ../>
. Поскольку кода не так много, чтобы показать, что он делает, трудно более четко определить, что именно нужно изменить.