如何在Phoenix中的控制器中触发频道广播

时间:2018-07-17 01:45:22

标签: elixir phoenix-framework

我正在尝试找出如何从控制器触发频道广播的方法。

示例

def create(conn, %{"message" => message_params}) do
with {:ok, %Message{} = message} <- Chat.create_message(message_params) do
  conn

  # TRIGGER CHANNEL BROADCAST "SHOUT" HERE

  |> put_status(:created)
  |> put_resp_header("location", message_path(conn, :show, message))
  |> render("show.json", message: message)
end end

水冷却器通道

defmodule NotificationWeb.WaterCoolerChannel do
 use NotificationWeb, :channel
 def join("water_cooler:lobby", _payload, socket) do
  {:ok, socket}
 end
 def handle_in("shout", payload, socket) do
 broadcast socket, "shout", payload
  {:noreply, socket}
 end
end

我尝试使用NotificationWeb.broadcast(topic, event, msg),但对要放入的内容感到困惑

topic =“ water_cooler”吗?

event =?

消息=?

1 个答案:

答案 0 :(得分:1)

可以使用NotificationWeb.Endpoint的{​​{3}}功能来广播消息。

  • topic是您要在其中广播的房间(例如water_cooler:lobby

  • event是您希望在客户端上收到的事件的名称

  • msg是事件中的其他信息

考虑到您在前端部分有这样的东西:

channel.on("new_msg", payload => {
  // process new message
})

然后event等于new_msg,并且msg是数据,此事件中的payload变量将包含