Laravel Livewire - Select 选择后输入数据丢失
Laravel Livewire - Select input data is lost after selection
我有商品(编号、代码、名称和价格)、仓库(编号和名称)和库存(item_id、warehouse_id、库存)模型,其中库存模型具有 item_id 和 warehouse_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 输入中使用这些项目
<select wire:model='selected_id'>
@foreach($items as $item)
<option value='{{$item->item->id}}'>{{$item->item->code}} - {{$item->item->name}} </option>
@endforech
</select>
这在初始加载时工作得很好。但是当我 select 来自项目 select 输入的项目时,所有项目都丢失并且在选项中得到空数组。
我不知道这段代码有什么问题。请帮我解决问题
简答
您应该只对那些应该由前端修改的属性使用 public 可访问属性。将 $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 将 public 属性序列化为可以发送到前端的格式。这就是为什么您仅限于基元(string
、int
、array
等)和一些 类(Model
和 Collection
)。 Livewire 在后台将 Collection
和 Model
序列化为某种格式,以便它可以在下一次渲染中再次执行查询,防止后续请求中的陈旧 Models
。
我认为这不能正常工作,因为您在 $items
属性.
的查询中使用了 groupBy
我有商品(编号、代码、名称和价格)、仓库(编号和名称)和库存(item_id、warehouse_id、库存)模型,其中库存模型具有 item_id 和 warehouse_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 输入中使用这些项目
<select wire:model='selected_id'>
@foreach($items as $item)
<option value='{{$item->item->id}}'>{{$item->item->code}} - {{$item->item->name}} </option>
@endforech
</select>
这在初始加载时工作得很好。但是当我 select 来自项目 select 输入的项目时,所有项目都丢失并且在选项中得到空数组。
我不知道这段代码有什么问题。请帮我解决问题
简答
您应该只对那些应该由前端修改的属性使用 public 可访问属性。将 $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 将 public 属性序列化为可以发送到前端的格式。这就是为什么您仅限于基元(string
、int
、array
等)和一些 类(Model
和 Collection
)。 Livewire 在后台将 Collection
和 Model
序列化为某种格式,以便它可以在下一次渲染中再次执行查询,防止后续请求中的陈旧 Models
。
我认为这不能正常工作,因为您在 $items
属性.
groupBy