Дополнительные переменные макета Phoenix, такие как @inner

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

window.onload = function () {
   @onload_js
}

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


person rockerBOO    schedule 02.09.2015    source источник


Ответы (1)


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

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документы для той же функции в последней версии Phoenix< /а>).

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

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

<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/.

person Gazler    schedule 02.09.2015