laravel 我如何知道事件是否已被触发?看起来好像没有

cngwdvgl  于 2023-05-23  发布在  其他
关注(0)|答案(1)|浏览(145)

我有一个UserShow组件,它显示用户的数据(姓名,电子邮件等),以及他在网站上通过关系(写的消息,喜欢等)所做的动作。现在我想允许用户更改他的一些数据(姓名,电子邮件等),所以我写了另一个组件称为UserEdit这里是表单,验证等。一切正常
由于我使用Livewire/Alpine,我有一些逻辑,如

<div x-data="{ isEditing = @entangle('isEditing) }">
    <section x-show="!isEditing" />
        ...All user data...
        <button x-on:click="isEditing=true">
    <section>

    <section x-show="isEditing">
        <livewire:user.user-edit :user="$user" />
    </section>
</div>

因此,这是可行的-它打开了用户将编辑其数据的组件。在表单末尾的组件中,我有两个按钮:

<div>
  <button type="submit">update</x-gui.button>
  <button type="button" wire:click="canceled">Cancel</button>
</div>

组件中取消的功能为:

public function canceled() {
  Log::info('Canceling Edit');
  $this->emitUp('canceled');
}

现在,在父元素中,我有listener和函数定义为:

protected $listeners = ['canceled' => 'restart'];

public function restart() {
  Log::info('canceled received');
}

当我单击组件中的cancel方法时,我看到第一个日志“Canceling Edit”,但没有看到“canceled received”消息
我做错什么了吗?我怎么知道“取消”的事件是否被触发了?

rsaldnfx

rsaldnfx1#

我发现发生了什么,这是一个非常奇怪的行为,所以它花了很长时间来调试。
这个非常具体的组件中的问题是,它显示了foreach中的所有消息,比如:

<div x-data="{ isEditing = @entangle('isEditing) }">
    <section x-show="!isEditing" />
        ...All user data... <=== PRECISELY HERE!!!
        <button x-on:click="isEditing=true">
    <section>

    <section x-show="isEditing">
        <livewire:user.user-edit :user="$user" />
    </section>
</div>

所有用户数据都有一个@foreach(),它正在呈现另一个组件:

@foreach($user->messages as $message)
    <livewire:message-card :message="$message" />
@endforeach

问题是这个livewire组件没有被键控,这导致了各种奇怪的事情发生,改变线路如下,解决了问题

<livewire:message-card :message="$message" :key="$message->id" />

所以,警示性的故事是:始终在循环中键入组件,即使它们只是用于显示信息,而不是对其进行操作

相关问题