Laravel echo:是否可以收听所有事件而不是特定事件?

时间:2017-10-06 11:33:17

标签: javascript laravel-echo

我在我的项目中实施了Laravel Broadcasting。一切都运转良好,但我想知道是否可以听取所有事件而不仅仅是特定事件?

目前我的前端有这个代码:

window.Echo.channel('office-dashboard')
  .listen('CompanyUpdated', (e) => {
    console.log(e.company);
  });
  .listen('CompanyDeleted', (e) => {
    console.log(e.company);
  });

我想以这样的方式构建我的事件,以便我可以抓住它究竟是什么样的事件,以及执行了什么样的动作。但是,如果我仍然必须专门听取每个事件,那就没用了,就像我现在这样。我想听一个频道中的所有事件,这可能吗?

我读了docs,但那些只讨论如何收听特定事件。

3 个答案:

答案 0 :(得分:2)

我遇到了同样的情况。我认为您需要聆听各个频道。但是您可以像下面这样将代码编写得更简洁一些。

    const channel = window.Echo.channel('office-dashboard')

    const eventsTolisten = [
      'CompanyUpdated',
      'CompanyDeleted',
    ]

    eventsTolisten.forEach(event => {
      channel.listen(event, e => {
        this.handleSocketEvents({
          name: event,
          data: e.data
        })
      })
    })

答案 1 :(得分:0)

是的。

您将必须访问PrivateChannel内的echo实例并创建一个全局侦听器:

channel.bind_global(function (event, data) {
  console.log(`The event ${event} was triggered with data ${data}`);
})

请参阅https://github.com/pusher/pusher-js#bind_global-and-unbind_global

答案 2 :(得分:0)

是的,这是可能的,我 5 分钟前刚刚在我的应用中实现了它。 在所有事件中使用 broadcastAs,如下所述:

https://laravel.com/docs/8.x/broadcasting#broadcast-name

然后您可以使用 broadcastWith 函数包含事件的名称:

https://laravel.com/docs/8.x/broadcasting#broadcast-data

--- 服务器端---

public function broadcastWith()
{
    return[
        'id' => 'RoomJoined',
        'message' => 'new user joined the room!'
    ];
}

public function broadcastAs()
{
    return 'event';
}

--- 客户端---

window.Echo.channel(this.channel).listen(".event", response => {
  console.log(response);
});

要区分事件,您可以在侦听器中使用 if 语句或传递函数名称以直接调用,每个事件的优缺点。