Laravel Livewire - 选择后选择输入数据丢失

Posted

技术标签:

【中文标题】Laravel Livewire - 选择后选择输入数据丢失【英文标题】:Laravel Livewire - Select input data is lost after selection 【发布时间】:2021-06-30 19:34:49 【问题描述】:

我有 Item (id, code, name & price), Warehouse(id & name) 和 Stock (item_id,warehouse_id, stock) 模型,其中 Stock 模型具有 item_id 和warehouse_id 关系键。我正在尝试使用 livewire mount 方法从库存模型中获取项目

public $items, $selected_id;

public function mount()

   $this->items = Stock::select('item_id', 'warehouse_id')->groupBy('item_id', 'warehouse_id')->get();


我在 livewire 组件的选择输入中使用这些项目

<select wire:model='selected_id'>

   @foreach($items as $item)
       <option value='$item->item->id'>$item->item->code - $item->item->name </option>
   @endforech

</select>

这在初始加载时工作得很好。但是当我从项目选择输入中选择一个项目时,所有项目都会丢失并在选项中获得空数组。

我不知道这段代码有什么问题。请帮我解决问题

【问题讨论】:

【参考方案1】:

简答

您应该只对那些应该由前端修改的公共可访问属性使用。将$selected_id 保留为属性,但将$items 属性更改为您在render 方法中传递给视图的变量或计算属性。

public $selected_id;

public function getItemsProperty()

    return Stock::select('item_id', 'warehouse_id')->groupBy('item_id', 'warehouse_id')->get();


public function render()

    return view('some-view', [
        'items' => $this->items,
    ])

说明

免责声明:我尚未使用调试器验证这一点,但这是我的最佳猜测。

Livewire 将公共属性序列化为可以发送到前端的格式。这就是为什么您仅限于原语(stringintarray 等)和某些类(ModelCollection)。 Livewire 在后台将CollectionModel 序列化为某种格式,以便它可以在下一次渲染中再次执行查询,从而防止后续请求中的Models 过时。

我认为这不能正常工作,因为您在查询 $items 属性时使用了 groupBy

【讨论】:

以上是关于Laravel Livewire - 选择后选择输入数据丢失的主要内容,如果未能解决你的问题,请参考以下文章

添加 select2 插件以选择选项后。 Laravel Livewire 搜索不起作用

Laravel Livewire:输入选择,选择默认选项

Laravel Livewire:在选择输入的更改上传递选项值

Laravel Livewire 绑定模型 Carbon 属性

将参数(当前选择的 $this->user->id 而不是 auth()->user()->id)从视图传递到 livewire + laravel 中的 createShow

使用 Alpine 创建一个“始终打开的日期选择器”|活线