[英]How to make a variable globally accessible across multiple templates
在我的 phoenix 应用程序中,我正在尝试加载一堆数据并使它们可以访问我的根模板(跨所有页面)。 据我所知,这是通过分配完成的,但我不知道在哪里加载它。
我想像
use App.LiveView
use App.News
assign(socket, news: News.all)
应该可以工作,但我不知道把这段代码放在哪里,所以套接字是可用的。 来自 Express.js,我想做类似的事情:
router.use((req, res, next) => {
// Load news into global variable
// ...
next()
})
感谢您的帮助。
Express 的router.use
的非 LiveView Phoenix 等效项是Router.plug/2
。 您可以在管道中添加一个插件。
一个插头既可以定义为一个模块,也可以定义为一个简单的 function。
这是一个最小的例子:
pipeline :browser do
plug :accepts, ["html"]
plug :fetch_session
# ...
plug :my_plug # <= add your plug
end
def my_plug(conn, _opts) do
Plug.Conn.assign(conn, :news, News.all())
end
但这不适用于 LiveView,它无法访问插头分配。 从 LiveView 0.17 开始,您可以使用挂载挂钩来实现此目的。 您需要将on_mount/1
添加到AppWeb.live_view/0
。
def live_view do
quote do
use Phoenix.LiveView,
layout: {AppWeb.LayoutView, "live.html"}
on_mount AppWeb.NewsLiveFetcher # <= add this
unquote(view_helpers())
end
end
并实现AppWeb.NewsLiveFetcher
类似:
defmodule AppWeb.NewsLiveFetcher do
import Phoenix.LiveView
def on_mount(:default, _params, _session, socket) do
socket = assign_new(socket, :news, &News.all/0)
{:cont, socket}
end
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.