【问题标题】:Livewire: persist custom objects in Livewire component after wire:click?Livewire:在连线后将自定义对象保留在 Livewire 组件中:单击?
【发布时间】:2021-08-25 08:54:27
【问题描述】:

我可以在整个 Livewire 生命周期中继续使用自定义对象的集合吗?
我创建了一个集合,将它们显示在一个列表中,并在用户选择一个时采取行动。

目前它们仍然是刀片中的对象@foreach(即{{ $item->name }},但在wire:click(即$item['name'])之后以数组形式结束,这会在之后再次运行相同的@foreach完成wire:click 方法。

但更重要的是,每个自定义对象都包含一个模型集合,并且它们也被转换为普通数组。

目前看来这是expected behavior,因为 Livewire 不知道如何为它们补充水分(与 Eloquent 模型不同)。

我希望我可以将对象存储在受保护的属性中,但这些对象不会持续存在,just like the documentation says

有没有办法实现类似的流程,我显示一个列表(使用来自自定义对象的数据)并对选定的自定义对象执行操作?

【问题讨论】:

    标签: laravel laravel-livewire


    【解决方案1】:

    protected 属性确实只对一致的变量有用,例如规则,或者设置每个请求的变量不能公开。

    至于收集问题,答案似乎已经在您链接的 github 问题线程中,只需将数组重新启动为对象即可。它(目前)是预期的行为,因为它不能再水化。你可以在集合上做一个地图:

    $this->customCollection = $this->customCollection->map(function($item) {
        return is_array($item) ? (object) $item : $item;
    });
    

    或者像这样的foreach:

    foreach ($this->customCollection as $index => $item) {
        if (is_array($item)) {
            $this->customCollection[$index] = (object) $item;
        }
    }
    

    对于每个集合嵌套,如果您特别想要自定义对象,则必须执行相同的循环。它可能会损失性能,您最好使用 Eloquent 集合/模型或纯数组。

    【讨论】:

    • 感谢Yinci,所提到问题中的答案确实可以作为简单标准类对象的解决方法,但需要自定义“再水化”操作来再水化自定义对象中的每个 Laravel 模型集合.想知道是否有一种聪明的方法来“存储”自定义对象集合。现在探索:缓存集合并在每个操作中检索它。
    • 我没想过缓存。如果您确实需要自定义集合,缓存是一个不错的选择。关于为什么 Eloquent 在您的情况下不起作用的任何理由?
    • 缓存确实起到了作用。 :-) 我对 Eloquent 模型进行分析并创建自定义对象(例如,基于 latlon Trackpoint 坐标的反向地理编码结果,按访问分组)。只有在用户选择其中一个建议后,该地点才会转换为 Laravel 模型并链接到访问 Trackpoints。
    • 我想分析比较复杂吧?否则将其作为 mutator 属性也可以解决问题吗? (没试过这个)。无论如何,很高兴听到缓存正在工作。
    • 是的,分析复杂且“昂贵”,因为它需要对外部服务进行 REST API 调用。
    猜你喜欢
    • 1970-01-01
    • 2021-08-21
    • 2021-04-10
    • 2021-06-21
    • 2021-02-20
    • 2021-07-18
    • 2021-09-08
    • 2021-04-09
    • 1970-01-01
    相关资源
    最近更新 更多