2015-09-02 3 views
11

Я ищу для добавления дополнительных макета параметров, таких как @inner для макета. Например, @title для <title>@title</title> и область для onload javascript для отдельных страниц.Дополнительные параметры компоновки Phoenix, такие как @inner

window.onload = function() { 
    @onload_js 
} 

Они установлены в макете, поэтому я не уверен, что лучший способ справиться с ними в Фениксе. Спасибо д.

ответ

21

Для заголовка страницы, вы можете просто передать значение через от контроллера:

def edit(conn, params) do 
    render(conn, "edit.html", page_title: "Edit The Thing") 
end 

<head> 
    <title><%= assigns[:page_title] || "Default Title" %></title> 
</head> 

Обратите внимание, что это использует assigns[:page_title] вместо @page_title или assigns.page_title, как они будут ошибки, если ключ :page_title нет в правопреемников ,


Для включения шаблонов (ваш пример сценария) есть render_existing/3.

документация дает аналогичный пример тому, что вы просили, чтобы я скопировал его здесь для удобства:

Рассмотрим случай, когда расположение приложение позволяет вид динамически визуализировать часть тегов сценария в голове документ. Некоторые представления могут захотеть вставить определенные скрипты, а другие - нет.

<head> 
    <%= render_existing view_module(@conn), "scripts.html", assigns %> 
</head> 

Затем модуль для представления @inner может принять решение о предоставлении сценариев либо с скомпилированного шаблона, либо путем реализации функции непосредственно, а именно:

def render("scripts.html", _assigns) do 
    "<script src="...">" 
end 

Чтобы использовать предварительно скомпилированный шаблон, создайте файл scripts.html.eex в каталоге шаблонов для соответствующего представления, которое вы хотите отобразить. Например, для UserView создайте файл scripts.html.eex в web/templates/user /.

+0

Amazing! Спасибо за объяснение. Очень помогли понять это. – rockerBOO

+0

Это работает, но что делать, если вы хотите добавить много метаданных для конкретной страницы. Ваши методы управления станут беспорядочными! Плюс контроллеры должны быть для бизнес-логики в любом случае. Я рекомендую использовать ** render_existing/2 ** функцию, как описано [здесь] (http://blog.danielberkompas.com/2016/01/28/seo-tags-in-phoenix.html) –

Смежные вопросы