gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 02:03:15 25 4
gpt4 key购买 nike

您好,我使用不同的域名来加载不同的数据集。我目前正在使用自定义插件根据主机名加载正确的域 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,因为我在每个 View 中分配了 domain_id。但是,如何从插件中获取注入(inject)到我的 LiveView 中的 domain 数据?

目前我已经将相同的域代码复制到每个 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

有什么方法可以让插件有效地将这些数据推送到实时 View ,而无需为每个安装添加代码?

最佳答案

我的应用程序中有一个类似的用例,我的插件将 user 结构放在 assigns 上,我想将该数据保留在实时 View 中而不重新加载所有东西。

我能做到的唯一方法是使用 option来自 live 路由的 session 将其传递给 MFA。

在路由器中你会有类似的东西

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

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

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

然后在您的mount 上,您将在session 中拥有"domain_id"

defmodule WebApp.WelcomeLive do
use WebApp, :live_view

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

关于elixir - 如何将插件加载的数据传递给 LiveView 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65357773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com