this questionthis 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),它起作用了!

推荐答案

您说得对,父div上的wire:ignore使Livewire忽略对DOM该部分的任何更新.它永远不会改变它里面的任何东西.

因此,要使段落显示,只需将输入本身向下移动wire:ignore即可.

<div class="mb-3">
    <label for="pickeddatetime" class="form-label">Date and time</label>
    <input id="pickeddatetime" wire:ignore.self 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:ignorewire:ignore.self,因为Flatickr库将修改和维护实际输入的状态.

然而,这只解决了问题的一半,因为当对该属性的验证失败时,仍然不会应用类is-invalid.要做到这一点,要么将类放在包装器上,然后以将其放在输入上的方式应用CSS,要么需要在Flatickr实例上使用某种侦听器或Change-Event,然后在应用或删除输入上的类之前判断验证是否失败,这意味着您需要使用JavaScript来应用它.

Php相关问答推荐

p a/a/p的x路径 Select ,但不是p somethext a链接/a或某些文本/p>

在不刷新页面的情况下无法使用JQuery更新id

在AJX请求中使用简写后,FormData出现非法调用错误

PHP php_mongodb.dll for 32bit

Symfony5:如何在不登录的情况下使API路由可访问?

使用php ZipArhive类将Zip压缩文件分成多个部分

在WooCommerce中添加特定产品类型的百分比费用和固定费用

在Laravel中创建辅助函数时的约定

Laravel withOnly不限制查询

如何批量处理消息总线中的消息

当未 Select 任何变体时,在 WooCommerce 可变产品上显示自定义文本

需要以一种形式执行两个操作

如果 Select 的县不是store 所在的县,如何隐藏本地自提?

尽管有use指令,PHP 类在其他文件中仍处于可见状态

在 groupBy laravel 5.7 中 Select 多列

在这个 Laravel 应用中,如何仅显示已批准的 comments 回复?

同一页面上多个组件的 Livewire 分页问题

PDO 和 SQL 查询结果中日期格式不同的原因可能是什么?

PHP 日期格式:ISO8601 与 ISO8601_EXPANDED

Laravel 查询关系是否为 bool