如何在 Livewire 2 中实现实时验证?

Mea*_*nes 3 laravel-livewire

在我应用新的 livewire V2 编程风格之前,我有一个连接到模型单独属性的表单。为了触发字段的实时验证,我在组件中使用了它(例如 name 属性):

public function updatedName(){
      $this->validate(['name' =>'required|max:127']);
}
Run Code Online (Sandbox Code Playgroud)

name 是名为Malt的 Model 的属性。我的问题是:如何修改这个 updatedName() 函数?

我已经明白我应该将函数重命名为 updatedMaltName,因此我尝试了这个。

public function updatedMaltName(){ 
  $this->validate(['name' =>'required|max:127']);
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用。相反,只要我在字段中键入字符(这与应该发生的情况相反),它就会显示错误“名称字段是必需的”,并且即使我清空该字段也永远不会隐藏此错误。

我也试过这个

public function updatedMaltName(){
      $this->validate(['malt.name' =>'required|max:127']);
    }
Run Code Online (Sandbox Code Playgroud)

但这根本行不通。

Qir*_*rel 5

$rules在组件类的属性中定义规则集。

protected $rules = [
    'malt.name' => 'required|max:127',
];
Run Code Online (Sandbox Code Playgroud)

您现在可以挂钩updated()方法和validateOnly()刚刚更新的字段。现在,这将验证模型上正在更新的任何字段,规则集在$rules.

public function updated($property)
{
    $this->validateOnly($property);
}
Run Code Online (Sandbox Code Playgroud)

该$property参数是要更新的字段的名称,因此,例如malt.name。

您当然可以连接到您正在更新的特定属性,并仅验证该字段。这假设您在具有属性$malt的属性name中有一个模型。

public function updatedMaltName()
{
    $this->validateOnly('malt.name');
}
Run Code Online (Sandbox Code Playgroud)

  • @SühaBoncukçu 这正是 `wire:model.defer` 所做的,所以这是预期的行为。对于那些担心发出太多请求的人,您可以使用“wire:model.lazy”来限制它们,或者引入较慢的防抖“wire:model.debounce.500ms”。通过使用“wire:model.defer”,请求将被排队并在发出下一个请求时发送,无论何时。 (2认同)