繁体   English   中英

如何使变量在多个模板中全局可访问

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM