Elixir 如何将插件加载的数据传递给LiveView组件

Elixir 如何将插件加载的数据传递给LiveView组件,elixir,phoenix-live-view,Elixir,Phoenix Live View,嗨,我使用不同的域名加载不同的数据集。我目前正在使用自定义插件根据主机名加载正确的域id。例如,在路由器前面的我的endpoint.ex中得到了这个: plug WebApp.DomainCheck socket "/live", Phoenix.LiveView.Socket, websocket: [connect_info: [session: @session_options]] ... plug WebApp.Router 及 现在这适用于正常的视图,因为我在每个

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

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

现在这适用于正常的
视图
,因为我在每个视图中都分配了
域id
。但是我如何从一个插件将
数据注入我的
LiveView
s中呢

目前,我已经在每个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

有没有什么方法可以使插件有效地将这些数据下推到实时视图中,而无需在每次装载时都添加代码?

我的应用程序中也有类似的用例,我的插件将a
用户
结构放在
分配
上,我希望将这些数据保存在实时视图中,而不重新加载所有内容

我能做到这一点的唯一方法是使用
现场
路径中的
会话
传递MFA

在路由器中,您将有如下内容

live "/page", WebApp.SomeLiveView, :show, session: {WebAppp.Helpers, :keep_domain_id, []}
您的
WebApp.Helpers
将具有该功能,可将您希望传递给live view的内容作为
会话
返回

defmodule WebApp.Helpers do
  def keep_domain_id(conn) do
    %{"domain_id" => conn.assigns.domain_id}
  end
end
然后在您的
挂载
中,您将在
会话中输入
“域id”

defmodule WebApp.WelcomeLive do
  use WebApp, :live_view

  @impl true
  def mount(_args, %{"domain_id" => domain} = _session, socket) do
    ...
  end
end

谢谢你!我认为这对用户对象很有用,但是这个会话不是在所有视图之间共享的吗?例如,如果用户在不同的主机URL上有两个打开的选项卡,会话值不会相互覆盖吗?虽然它们共享来自客户端的标准会话,但有些值实际上是相同的,但当您从连接(在本例中,从每个选项卡)获得
domain\u id
值时,它将在会话中为特定的实时视图设置正确的值。我将尝试这样做,并将其标记为正确答案,如果它有效的话。
defmodule WebApp.WelcomeLive do
  use WebApp, :live_view

  @impl true
  def mount(_args, %{"domain_id" => domain} = _session, socket) do
    ...
  end
end