如何将插入加载的数据传递给实时视图组件



嗨,我正在使用不同的域名来加载不同的数据集。我目前正在使用自定义插件根据主机名加载正确的域 ID。例如,在路由器之前在我的endpoint.ex中得到了这个:

plug WebApp.DomainCheck
socket "/live", Phoenix.LiveView.Socket, websocket: [connect_info: [session: @session_options]]
...
plug WebApp.Router

defmodule WebApp.DomainCheck do
import Plug.Conn
@behaviour Plug
def init([]), do: []
def call(conn, _options \ []) do
domains = Model.load_allowed_domains()
case Map.get(domains, conn.host) do
nil ->
conn
|> resp(401, "Domain not allowed")
|> halt()
domain_id ->
conn
|> assign(:domain_id, domain_id)
end
end
end

现在这适用于普通View因为我在每个domain_id分配。但是,如何从插头将domain数据也注入我的LiveView

目前,我已经将相同的域检查复制到每个 LiveViews mount()页面中:

defmodule WebApp.WelcomeLive do
use WebApp, :live_view
@impl true
def mount(_args, _session, socket) do
domains = Model.load_allowed_domains()
host = socket.host_uri.host
case Map.get(domains, host) do
nil -> {:error, "Domain not allowed"}
domain_id -> {:ok, assign(socket, :domain_id, domain_id)}
end
end

有什么方法可以使插件有效地将此数据推送到实时视图,而无需向每个挂载添加代码?

我的应用程序中有一个类似的用例,我的插头将 auser结构放在assigns上,我想将数据保存在实时视图中而不重新加载所有内容。

我能实现这一点的唯一方法是使用live路由中的选项session传递 MFA。

在路由器中,您将拥有类似的东西

live "/page", WebApp.SomeLiveView, :show, session: {WebAppp.Helpers, :keep_domain_id, []}

您的WebApp.Helpers将具有该函数,将您希望传递给实时取景的内容作为session返回。

defmodule WebApp.Helpers do
def keep_domain_id(conn) do
%{"domain_id" => conn.assigns.domain_id}
end
end

然后,在你的mount中,你将有"domain_id"钥匙在你的session

defmodule WebApp.WelcomeLive do
use WebApp, :live_view
@impl true
def mount(_args, %{"domain_id" => domain} = _session, socket) do
...
end
end

最新更新