2016-09-17 55 views
0

我有一個基本應用程序的佈局:如何渲染父級內部的子佈局?

#layouts/base.html.eex 
<body> 
    <div id="base_layout.html"> 
    <!-- some content --> 
    <%= render(@view_module, @view_template, assigns) %> 
    <!-- some content --> 
    </div> 
</body> 

我有其他20個不同的佈局。我想從base.html.eex繼承它們全部。我怎樣才能做到這一點?我已經試過這樣:

#layouts/child_layout5.html.eex 
<div id="child_layout5.html"> 
    <!-- some content --> 
    <%= render(@view_module, @view_template, Map.put(assigns, :layout, {MyApp.LayoutView, "base.html"})) %> 
</div> 

但這恰恰使該基地佈局裹成<div id="child_layout5.html">

雖然我希望它是反之亦然:渲染child_layoutXX.html.eexbase.html裏面的內容,從child_layoutXX.html.eex

注意base.html不知道其孩子child_layoutXX.html.eex的,有多少是,如果有的話,是什麼他們的名字是,也就是base.html不能通過它的名字明確地呈現其任何子女。

功能https://hexdocs.pm/phoenix/Phoenix.View.html#render/3到目前爲止還沒有幫助我。

回答

2

以下是您將子佈局傳遞給render的指定地圖並讓base佈局使用它的一種方法。您可以爲每個動作傳遞child_layout的不同值。這樣base佈局沒有任何硬編碼的子佈局。

# controllers/page_controller.ex 
defmodule MyApp.PageController do 
    use MyApp.Web, :controller 

    def index(conn, _params) do 
    conn 
    |> put_layout("base.html") 
    |> render("index.html", child_layout: "child_layout5.html") 
    end 
end 
# templates/layout/base.html.eex 
<body> 
    <div id="base_layout.html"> 
    <%= render(@view_module, @view_template, Map.put(assigns, :layout, {MyApp.LayoutView, @child_layout})) %> 
    </div> 
</body> 
# templates/layout/child_layout5.html.eex 
<div id="child_layout5.html"> 
    <%= render(@view_module, @view_template, assigns) %> 
</div> 
# templates/page/index.html.eex 
<!-- index.html --> 

輸出:

<body> 
    <div id="base_layout.html"> 
<div id="child_layout5.html"> 
<!-- index.html --> 
</div> 
    </div> 
</body> 

編輯:爲了使base模板還上班的時候child_layout沒有通過,你可以這樣做:

<body> 
    <div id="base_layout.html"> 
    <%= render(@view_module, @view_template, if(assigns[:child_layout], do: Map.put(assigns, :layout, {MyApp.LayoutView, @child_layout}), else: assigns)) %> 
    </div> 
</body> 
+0

好的,但如何使參數'@ child_layout'不是強制性的?也就是說,base.html僅在傳遞參數「@ child_layout」時呈現子佈局。 – Johshi

+0

好的。有沒有其他辦法可以做到這一點? – Johshi

+0

「其他方式」是什麼意思? – Dogbert