【发布时间】:2022-01-14 18:42:48
【问题描述】:
我有一个具有以下属性的 Livewire 组件...
class MyClass extends Livewire\Component {
public $dataCollection; // instance of Illuminate\Database\Eloquent\Collection
public $dataArray; // converted to an array of arrays
/* ... blah ... */
function getData() {
/* ... */
$this->dataCollection = $ordersModel->processMySearch($srch)->get(); // returns multiple lines of data, producing a Collection
$this->dataArray = $this->dataCollection->toArray();
}
}
现在,我的目标是将这些数据推送到 Livewire/Blade 模板并将其与 AlpineJS 变量纠缠在一起。
<div x-data="{
myCollection: @entangle('dataCollection').defer,
myArray: @entangle('dataArray').defer
}">
<table>
<tbody>
<template x-for="myRow in myCollection">
<tr>
<template x-for="(myData, colName) in myRow">
<td :class="colName" x-text="myData"></td>
</template>
</tr>
</template>
</tbody>
</table>
</div>
它不起作用,因为模型集合似乎没有正确地从 Livewire/PHP 转换(或映射)到 Alpine myCollection 变量。当我对变量运行console.log() 调试时,它告诉我它是一个空数组。
但是,如果我循环使用 myArray 变量(而不是 myCollection 变量):
<table>
<tbody>
<template x-for="myRow in myArray">
<tr>
<!-- etc -->
然后HTML表格很好地在页面上生成。
我更喜欢使用 Collection 对象的原因是因为我可能想要更新表中的一些数据。如果我能够更新 (@entangleed) 模型对象中的数据并将模型同步回 Livewire/PHP 组件,那么我不需要在 PHP 中重新生成模型,可能会为我节省一些数据库调用。
是否可以通过这种方式将@entangleAlpine 变量添加到 PHP 集合中?如果是这样,我做错了什么,为什么在上面的示例中不起作用?
x
免责声明 上面的代码是我正在处理的一个更大项目的(非常)简化的摘录。它不是原始代码的直接复制/粘贴,因此可能包含轻微的语法错误。请将其视为伪代码。
【问题讨论】:
-
组件中声明的属性与 Alpine @entangle('dataCollectionData').defer 中的 this 之间存在差异。打错字了?
-
是的,这是一个错字。我会纠正它。感谢您指出。它不会改变整个问题的重点。
标签: javascript laravel-livewire alpine.js