繁体   English   中英

继承Phoenix / Elixir中的布局

[英]Inheriting layouts in Phoenix/Elixir

我需要为我的Phoenix / Elixir应用程序创建一个简单的布局层次结构,并从不同的布局继承我的模板。 我知道如何为单个布局和多个模板做到这一点。 但是我怎样才能从另一个布局继承一个布局呢?

比如,层次结构是layout1 - > layout2 - > layout3和template2(layout2),template3(layout3)。

在文档中没有提到这一点。

更新

基本布局是基本布局 - 类似于OOP中的基类,它不知道它的子布局 - 有多少 ,如果有的话。 因此,从基础调用“render children1”是没有意义的。

布局可以通过传递一个嵌套layout重点assigns调用渲染时:

<%= render @view_module, @view_template, Map.put(assigns, :layout, {MyApp.LayoutView, "nested.html"}) %>

以下是Phoenix.View.render / 3文档的相关部分

分配

分配是指模板中可用的用户数据。 然而,凤凰城特别处理的指令下有钥匙,它们是:

  • :layout - 告诉Phoenix将渲染结果包装在给定的布局中。 见下一节。

以下分配是保留的,不能直接设置:

  • @view_module - 正在渲染的视图模块
  • @view_template - 正在呈现的@view_module模板## Layouts模板可以使用:layout选项在其他模板中呈现。 :layout接受表单的元组
    {LayoutModule, "template.extension"}

要在布局中呈现模板,只需使用@view_module@view_template分配调用render/3

  <%= render @view_module, @view_template, assigns %> 

对于3种布局,您可以执行以下操作:

# Controller
render(conn, "index.html", nested_1: "nested_1.html", nested_2: "nested_2.html")

# app.html.eex
<%= render @view_module, @view_template, Map.put(assigns, :layout, {MyApp.LayoutView, assigns.nested_1}) %>

# nested_1.html.eex
<%= render @view_module, @view_template, Map.put(assigns, :layout, {MyApp.LayoutView, assigns.nested_2}) %>

# nested_2.html.eex
<%= render @view_module, @view_template, assigns %>

我解决这个问题的方法是在View中添加一个帮助器来呈现父布局:

defmodule MyApp.LayoutView do
  use MyApp.Web, :view

  def base_layout(conn, opts, do: contents) when is_list(opts) do
    render "base.html", [conn: conn, contents: contents] ++ opts
  end
end

帮助器中的“contents”参数将是您在do / end块中放置的任何内容,因此您可以在HTML中使用它来进行“子布局”,例如:

<%= base_layout @conn, [foo: "bar"] do %>

    <div class="sublayout-wrapper">
      <%= render @view_module, @view_template, assigns %>      
    </div>
    <!-- specific footer for sub-layout goes here etc -->

<% end %>

在base.html布局中,我输出@contents变量,我需要在其中呈现内容,如:

<html>
<head>
    <title>My App</title>
</head>
<body>
    <div class="header"></div>
    <%= @contents %>
</body>

这有点像黑客,但到目前为止,它是我发现问题的最佳解决方案。

请注意,我还添加了一个opts参数,以便能够在特定情况下覆盖某些赋值(我主要使用它来定义要附加在<html><body>上的html css类,具体取决于要渲染的子布局)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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