【问题标题】:Laravel Livewire - Select input data is lost after selectionLaravel Livewire - 选择后选择输入数据丢失
【发布时间】: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>

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

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

【问题讨论】:

    标签: laravel laravel-livewire selectinput


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2021-08-22
      • 1970-01-01
      • 2021-12-10
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 2022-06-13
      相关资源
      最近更新 更多