You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Filament表单提交后数据无法传入Wire Elements模态框求助

问题描述

我有一个包含Select和DatePicker的Filament表单,希望在提交时将填写的数据传递给通过提交事件触发的Wire Elements模态框,但提交后弹出的模态框中{{ dd($data) }}无内容显示,请问我哪里操作有误?


现有实现代码

Filament Form组件

class Create extends Component implements HasForms {
use InteractsWithForms;

public $data;

public function mount($office = null): void 
{
    $this->office = $office;
    $this->form->fill([
        'office_id' => $this->office,
    ]);
}

protected function getFormSchema(): array
{
    return [
        Section::make('User (Admin)')
            ->schema([
                    Select::make('user_id')
                        ->label('User')
                        ->options(User::orderBy('name')->get()->pluck('name', 'id'))
                        ->columnSpan(2)
                        ->searchable()
                        ->default(Auth::id())
                        ->disablePlaceholderSelection()
                        ->required(),
        ])->columns([
            'sm' => 1,
            'xl' => 2])
        ->hidden(Auth::user()->admin != true),

        Section::make('Date')
            ->schema([
                    DatePicker::make('date')
                        ->label('Date')
                        ->minDate(now()->startOfDay()->addDay())
                        ->displayFormat('d.m.Y')
                        ->required()
                        ->columnSpan(2),
        ])->columns([
            'sm' => 1,
            'xl' => 2]),
}

protected function getFormStatePath(): string 
{
    return 'data';
}

public function render()
{
    return view('livewire.reservations.create');
}}

表单Blade模板

<form wire:submit.prevent='$emit("openModal", "modal.reservations", {{ json_encode(["data" => $data]) }})'>
    {{ $this->form }}

    <x-button type="submit" class="mt-4">
        Show Details
    </x-button>
</form>

模态框组件

class ReservationsShowDesks extends ModalComponent {
public $data;

public function mount($data)
{
    $this->data = $data;
}

public function close()
{
    $this->closeModal();
}

public function render()
{
    return view('livewire.modal.reservations');
}}

错误原因与修复方案

核心错误

你在Blade模板中直接使用{{ json_encode(["data" => $data]) }}生成emit参数,这部分代码是页面首次渲染时的静态值,用户填写表单后,Livewire组件内的$data已经更新,但Blade不会重新渲染这段代码,导致传递给模态框的始终是页面加载时的初始空数据。

修复步骤

1. 修改Filament Form组件,添加提交方法

在Create组件中新增submit方法,通过组件内部触发emit事件,传递最新的$data:

class Create extends Component implements HasForms {
    use InteractsWithForms;

    public $data;
    public $office; // 补全未声明的属性

    public function mount($office = null): void 
    {
        $this->office = $office;
        $this->form->fill([
            'office_id' => $this->office,
        ]);
    }

    // 新增提交方法
    public function submit()
    {
        $this->validate(); // 先执行表单验证
        $this->emit('openModal', 'modal.reservations', ['data' => $this->data]);
    }

    protected function getFormSchema(): array
    {
        return [
            Section::make('User (Admin)')
                ->schema([
                        Select::make('user_id')
                            ->label('User')
                            ->options(User::orderBy('name')->get()->pluck('name', 'id'))
                            ->columnSpan(2)
                            ->searchable()
                            ->default(Auth::id())
                            ->disablePlaceholderSelection()
                            ->required(),
                ])->columns([
                    'sm' => 1,
                    'xl' => 2])
                ->hidden(Auth::user()->admin != true),

            Section::make('Date')
                ->schema([
                        DatePicker::make('date')
                            ->label('Date')
                            ->minDate(now()->startOfDay()->addDay())
                            ->displayFormat('d.m.Y')
                            ->required()
                            ->columnSpan(2),
                ])->columns([
                    'sm' => 1,
                    'xl' => 2]),
        ]; // 补全缺失的数组闭合括号
    }

    protected function getFormStatePath(): string 
    {
        return 'data';
    }

    public function render()
    {
        return view('livewire.reservations.create');
    }
}

2. 修改Blade模板的表单提交事件

将原来的inline emit逻辑改为调用组件的submit方法:

<form wire:submit.prevent="submit">
    {{ $this->form }}

    <x-button type="submit" class="mt-4">
        Show Details
    </x-button>
</form>

3. 模态框组件保持不变

你的模态框组件逻辑是正确的,无需修改,确保视图中的{{ dd($data) }}能正常输出接收的数据即可。


内容的提问来源于stack exchange,提问作者wik0rl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:15:47