我需要为我的 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"}) %>
Run Code Online (Sandbox Code Playgroud)
这是Phoenix.View.render/3文档中的相关部分
分配
分配意味着模板中可用的用户数据。然而,在 allocate 下有一些由 Phoenix 专门处理的键,它们是:
:layout- 告诉 Phoenix 将渲染结果包装在给定的布局中。请参阅下一节。以下分配是保留的,不能直接设置:
@view_module- 正在渲染的视图模块@view_template-@view_module正在渲染的模板 ## 布局 可以使用该选项在其他模板中渲染模板:layout。:layout接受形式的元组
{LayoutModule, "template.extension"}。要在布局中渲染模板,只需调用
render/3并@view_module分配@view_template:Run Code Online (Sandbox Code Playgroud)<%= 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 %>
Run Code Online (Sandbox Code Playgroud)