我正在使用 Filament 和 Laravel,目前我已经获得了这两个字段输入,用于在
form()
方法中选择基于省份字段的城市:
Select::make("meta.employment_state")
->label("Province")
->getSearchResultsUsing(fn (string $search): array => State::query()->where('name', 'like', "%{$search}%")->limit(10)->pluck('name', 'id')->toArray())
->getOptionLabelUsing(fn ($value): ?string => State::find($value)?->name)
->afterStateUpdated(function (Set $set) {
$set('meta.employment_city', null);
})
->live()
->searchable()
->extraAttributes(['x-data' => '{ selected: false }', 'x-on:change' => 'selected = $event.target.value !== ""'])
->dehydrated(false),
Select::make("meta.employment_city")
->label("City")
->getSearchResultsUsing(fn (string $search, Get $get): array => City::query()->whereRelation('state', 'id', '=', $get('meta.employment_state'))->where('name', 'like', "%{$search}%")->limit(10)->pluck('name', 'id')->toArray())
->getOptionLabelUsing(fn ($value): ?string => City::find($value)?->name)
->placeholder('انتخاب کنید')
->searchable()
->extraAttributes(['x-show' => 'selected', 'x-cloak' => true]),
基本上我想做的是隐藏第二个输入,即城市输入,直到第一个输入被填充。
这必须动态完成,所以我添加了 JS 属性来制作东西,但不起作用,并且仍然显示城市输入,而不需要填写省份输入,这是错误的。
那么如何用 Filament 做到这一点?
您不需要添加额外的属性来隐藏字段。您可以使用 Filament 的
visible()
或 hidden()
(docs) 方法,结合 $get 来获取 Form 状态。像这样的东西应该有效:
Select::make("meta.employment_state")
->label("Province")
->getSearchResultsUsing(fn (string $search): array => State::query()
->where('name', 'like', "%{$search}%")
->limit(10)
->pluck('name', 'id')
->toArray()
)
->getOptionLabelUsing(fn ($value): ?string => State::find($value)?->name)
->afterStateUpdated(function (Set $set) {
$set('meta.employment_city', null);
})
->live()
->searchable()
->dehydrated(false),
Select::make("meta.employment_city")
->label("City")
->getSearchResultsUsing(fn (string $search, Get $get): array => City::query()
->whereRelation('state', 'id', '=', $get('meta.employment_state'))
->where('name', 'like', "%{$search}%")
->limit(10)
->pluck('name', 'id')
->toArray()
)
->getOptionLabelUsing(fn ($value): ?string => City::find($value)?->name)
->placeholder('انتخاب کنید')
->searchable()
->visible(fn (Get $get) => !empty($get('meta.employment_state'))),