如何解决Laravel Livewire - 选择后选择输入数据丢失 简答说明
我有 Item (id,code,name & price),Warehouse(id & name) 和 Stock (item_id,warehouse_id,stock) 模型,其中 Stock 模型有 item_id 和仓库_id 关系键。我正在尝试使用 livewire 安装方法从库存模型中获取项目
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>
这在初始加载时工作得很好。但是当我从项目选择输入中选择一个项目时,所有项目都丢失了,并且在选项中变成了空数组。
我不知道这段代码有什么问题。请帮我找出问题
解决方法
简答
您应该只对那些应该由前端修改的属性使用公共可访问属性。保留 $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 将公共属性序列化为可以发送到前端的格式。这就是为什么您只能使用原语(string
、int
、array
等)和某些类(Model
和 Collection
)的原因。 Livewire 在幕后将 Collection
和 Model
序列化为某种格式,以便它可以在下一次渲染中再次执行查询,防止在后续请求中出现过时的 Models
。
我认为这不能正常工作,因为您在查询 groupBy
属性时使用了 $items
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。