【问题标题】:Laravel Livewire wire:click() deleting component property?Laravel Livewire 线:单击()删除组件属性?
【发布时间】:2021-04-10 09:37:13
【问题描述】:

大家好,stackoverflowers, 在深入研究 Laravel8 Livewire 功能时,我反复遇到以下问题。在名为 Ticker 的 Livewire 组件中,我将日历表中的一系列日期数据读取到组件属性 $days 中。

在我看来,我使用wire:click$days 的每个元素显示一个div 元素,它应该连接到组件的tick() 方法。 视图渲染和安装正常,但每次单击元素时,都会出现 "Trying to get property 'id' of non-object $day->id" 错误 - 好像 $days 属性已被方法调用删除或清空。谁能帮助我理解这种行为?

组件Ticker.php:

class Counter extends Component
{
   public $days;

   public function mount()
   {
       $this->days = \DB::table("caldays")->WhereBetween("id", [320, 326])->get();
   }

   public function render()
   {
       return view('livewire.ticker');
   }

   public function tick($id)
   {
       /* do stuff with selected $id */
   }
}

查看ticker.blade.php:

...
@foreach($days as $day)
    <div class="border border-light-blue-500 border-opacity-75 p-6 text-center"
         wire:click="tick({{ $day->id }})"
    >
@endforeach
...

提前致谢,祝您新年快乐,保持健康!

【问题讨论】:

  • 1.你为什么不使用模型? 2.tick()方法的代码是相关的,包括它可以提供帮助。
  • 嗨 Qirel,1。也许我错了,但我知道模型仅用于输入元素,在这种情况下我们没有。你会怎么做? 2. 为了测试,我在方法中尝试了大多数不同的代码位,包括将参数分配给变量或将方法主体完全留空。总是同样的错误。
  • 模型只是给定事物的表示。例如数据库记录。所以在这里有一个模型而不是使用 DB 外观是有意义的。循环时还必须使用wire:key。了解错误发生在哪一行也会有所帮助。
  • 你的建议是对的!我已将$this-&gt;days = \DB::table("caldays")-&gt;WhereBetween... 更改为$this-&gt;days = Calday::WhereBetween...,并且不再出现非对象错误。谢谢!我仍然不明白 Eloquent 和 Query Builder 集合的组件行为有何不同。

标签: components laravel-livewire


【解决方案1】:

你必须注意到这一点。删除您各自的日期后,无论如何这都不会更新您的收藏。因此,删除后您必须重新查询天数。或者只需从您的收藏中删除相应的天数。 试试这个:

@forelse($days as $day)
    <div class="border border-light-blue-500 border-opacity-75 p-6 text-center"
         wire:click="tick({{ $day->id }})"
    >
@empty
    <p>No day found</p>
@endforelse

另一种解决方案是:

@if(count($days>0)
    @foreach($days as $day)
        <div class="border border-light-blue-500 border-opacity-75 p-6 text-center"
             wire:click="tick({{ $day->id }})"
        >
    @endforeach
@endif

在php文件中:

public function tick($dayId){
    $day = \DB::table("caldays")->Where("id", $dayId)->get();
    $day->delete();
    if(in_array($dayId,$this->days)) {
        $key = array_search($dayId, $this->days);
        array_splice($this->days, $key, 1);
     }
}

【讨论】:

  • 这不会有任何区别,恰恰相反,将集合转换为数组并不是很有意义。
  • 对不起,我没有正确阅读描述。如果您在集合中只有一行并且您已删除 this 您将有一个空集合驱动 $day->id 以查找非对象的 id。
  • 如果集合为空,则不会在循环中对其进行迭代——即使您将其转换为数组,根据您的逻辑,您仍然会得到“尝试获取字符串的偏移量“id”/null”或类似的错误消息。所以这些更新的答案都不会改变任何东西,因为它在任何情况下都不会被循环。
  • 是的,你是对的。但这些只是重新检查。问题在于,如果我删除条目,它将不会更新集合。它再次循环相同的数据收集,但这次如果我想删除已经删除的数据。它将抛出错误“尝试获取非对象 $day->id 的属性 'id'”。我希望这是原因。
猜你喜欢
  • 2021-08-21
  • 2022-01-05
  • 2021-06-21
  • 2021-02-20
  • 2021-10-13
  • 2021-08-29
  • 2021-09-10
  • 2021-08-25
  • 2021-01-11
相关资源
最近更新 更多