在this question和this other question之后,我设法创建了flatickr元素并将数据发送到后端.问题是,尽管在验证日期时间的Rule
中,passes
方法返回false
,但表单中没有显示验证错误.
为便于阅读,以下是DatePicker的Blade 部分:
<div class="mb-3" wire:ignore>
<label for="pickeddatetime" class="form-label">Date and time</label>
<input id="pickeddatetime" class="form-control @error('pickeddatetime') is-invalid @enderror"
type="datetime-local" name="pickeddatetime" placeholder="Pick a date and time"
value="{{ old('pickeddatetime') }}" wire:model.debounce.500ms="pickeddatetime">
@error('pickeddatetime')
<p class="invalid-feedback">{{ $errors->first('pickeddatetime') }}</p>
@enderror
</div>
我相信这是由于wire:ignore
指令(用于使Flat Pickr与Livewire一起工作)阻止了DOM中的任何更改,但我仍然在学习,因此完全错误.
Update
我在input
字段中移动了wire:ignore
,这是我在Blade文件中所做的唯一更改.其中没有其他的wire:ignore
,@livewireScripts
在布局文件中(我可以在Livewire组件的DOM中看到脚本).
验证如下:当 Select DateTime时,调用updatedPickeddatetime
(确实如此)
public function updatedPickeddatetime($value)
{
$rules = $this->rules();
$rules['pickeddatetime'][] = new TimeSlotEmployeeRule($this->employee_id);
$this->validateOnly('pickeddatetime', $rules);
}
在TimeSlotEmployeeRule
中,passes
方法返回false
(出于测试目的).
我在validateOnly
方法中放置了一些策略性的dd
,我可以看到ValidationException
被抛出,ErrorBag
包含预期的消息.
但是,不会触发@error
指令(针对p
元素),也不会显示该元素.
Update 2: solved!
显然,这个问题是相关的,但问题出在别的地方:@error
指令运行良好,但我注意到在DOM中,p
被设置为display:none
.我认为,这与输入没有得到它的is-invalid
类有关,因此invalid-feedback
被隐藏了.
因此,我将其更改为<p class="invalid-feedback d-block">
(按照建议的here),它起作用了!