首页 > 解决方案 > 将 livewire 输入与循环/嵌套属性绑定的最有效方法

问题描述

我有一个 livewire 组件,它有大约 25 个属性。

public $prop1=[], $prop2=[], $prop3=[]等等。在我看来,我正在循环一个集合并显示一个通常将所有这些属性绑定到它的表单wire:model。但是循环的想法让我失望。我有类似的东西,wire:model="prop1.{{$key}}"但是因为我没有在渲染/挂载函数中声明属性值,绑定到属性数组显然不起作用。我的问题是处理这种情况的最有效方法是什么?我是否应该在 render 或 mount 函数中有一个循环遍历集合,如下所示:

public function render()
    {
        $this->collection_items = Items::all();
        foreach($this->collection_items as $key=>$item)
        {
           $this->prop1[$key] = $item->prop1;
           $this->prop2[$key] = $item->prop2;
           $this->prop3[$key] = $item->prop3;
           ..........
        }
        return view('livewire.my-view');
    }

然后在我看来我能做到wire:model="prop1.{{$key}}"吗?或者有没有其他奇特的方法可以做到这一点,而无需渲染方法中的循环,可以以更清洁的方式完成此任务?

标签: laravellaravel-livewire

解决方案


您可以将它们包装在一个数组中,而不是单独定义模型的每个属性:

public $items = [];

然后,您可以将您的密钥用作子密钥,并用于fill快速处理您的属性:

foreach($this->collection_items as $key => $item) {
    $this->fill(["items.{$key}" => $item->getAttributes()]);
}

然后,您的所有内容都$attributeKey => $attributeValue将设置在$this->items[$key]. 在您看来,您可以wire:model以任何您希望使用这些属性的方式设置您的带点表示法:

wire:model="items.{{$key}}.prop1"

您也可以将其填充为集合,只需调用$this->fill([$items => Items::all()]),但您不能wire:model添加到属性中。


推荐阅读