我有一个属性叫做公共$项目 = []
。这可以有多个嵌套数组,即:$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>
这个问题似乎与Livewire的生命周期有关。
所以我可以用laravelplayground重现这个问题。通用域名格式。在这里:
再现错误
不要在updateItems
中转储/dd。
事实上,items
在转储itemsupdateItems
时是不正确的。但是,如果在render
方法中转储,则项应该是正确的。
我要深入研究,了解为什么会发生这种事。但是我想可能有一些原始的items
和updateItems方法中使用的items
的合并,合并发生在update*
方法运行并且在调用render
之前。
我在laravel游乐场中做了另一个例子,它在视图组件中显示了项目内容,正如您所看到的,返回的数据总是正确的。
最后一个例子