提问者:小点点

更新时,Laravel Livewire未在数组中持久化数据


我有一个属性叫做公共$项目 = []。这可以有多个嵌套数组,即:$items.1,$items.2,$items.3等等。这些子数组中的每一个都需要保存至少两段数据。

$items[1]['prop1'] = "value 1";
$items[1]['prop2'] = "value 2";
$items[2]['prop1'] = "value 1";
$items[2]['prop2'] = "value 2";

我的问题是,在我看来,我有两个输入绑定到这些子属性。

然后,我根据这个输入添加一个新的数组条目。因此,如果用户在prop1中输入某个内容,数组将包含基于此输入自动生成的元素。

现在问题来了。当我更改prop1并在updateItems生命周期挂钩中捕获它时,它是正确的。但是当我更改prop2时,它会覆盖prop1,数组只保存一个值。

public function updatedItems($value, $nested)
{
    $nestedData = explode(".", $nested);
    // Get the nested property that was changed. this will yield a string formated as "1.prop1" or "2.prop1"
    // Let's pretend that the $value variable says "value 1" and the $nested variable is "1.prop1"
    if ($nestedData[1] == 'prop1') {
        $this->items[$nestedData[0]]["secondary_value"] = 'secondary value';
        // This should yield an items array that looks like this: items[1]['secondary_value'] = 'secondary value'
    }
    if ($nestedData[1] == 'prop2') {
        $this->items[$nestedData[0]]["third_value"] = 'third value';
        // This should yield an items array that looks like this: items[1]['third_value'] = 'secondary value'
    }
}

我期望得到一个items数组,如下所示:

$items = [
    "1" =['prop1' => 'value 1', 'secondary_value' => 'secondary value'],
    "2" =['prop2' => 'value 1', 'third_value' => 'third value']
]

但无论我做什么,items数组只保存一个值,即最近更改的值。因此,如果我先更改prop1,然后再更改prop2,数组将只包含prop2,它不会附加到数组中,而是基本上重新创建只包含该值的整个数组。

我已经研究了多个其他问题,这些问题建议添加我已经定义的$rules属性,但这仍然不能解决问题。我甚至尝试过设置一个会话变量,但似乎每次都会忽略这个问题。livewire是否使用了某种与laravels本机会话系统冲突的会话系统?如果您能帮助保存这些数据,以便我的数组能够同时保存input1和input2的值,我们将不胜感激。

看法

<tr>
    <td colspan="5">
            <select wire:model="items.1.right_eye_brand">
            <option value=""></option>
            @foreach ($sortedItems as $o)
                <option value="{{ $o }}">{{ $o->brand }}</option>
            @endforeach
        </select>
    </td>
</tr>
<tr>
    <td colspan="5">
        <select wire:model="items.1.left_eye_brand">
            <option value=""></option>
            @foreach ($sortedItems as $o)
                <option value="{{ $o }}">{{ $o->brand }}</option>
            @endforeach
        </select>
    </td>
</tr>

共1个答案

匿名用户

这个问题似乎与Livewire的生命周期有关。

所以我可以用laravelplayground重现这个问题。通用域名格式。在这里:

再现错误

不要在updateItems中转储/dd。

事实上,items在转储itemsupdateItems时是不正确的。但是,如果在render方法中转储,则项应该是正确的。

我要深入研究,了解为什么会发生这种事。但是我想可能有一些原始的items和updateItems方法中使用的items的合并,合并发生在update*方法运行并且在调用render之前。

我在laravel游乐场中做了另一个例子,它在视图组件中显示了项目内容,正如您所看到的,返回的数据总是正确的。

最后一个例子