这是基于Gazler's comment on the question 并且是一个略比the one submitted by cmititiuc 更普遍的答案。您不需要像在那个答案中那样包装特定于页面的 JavaScript 代码,也不需要在特定于页面的 script 元素中导入特定于页面的文件。
布局模板
在您的布局中使用Phoenix.View.render_existing/3,如下所示:
<head>
<%= render_existing @view_module, "scripts.html", assigns %>
</head>
...或者这个:
<head>
<%= render_existing @view_module, "scripts." <> @view_template, assigns %>
</head>
对于第一个示例,如果相关视图模块存在一个"scripts.html" 模板,这将呈现一个模板。
对于第二个示例,"scripts." <> @view_template 模板,例如scripts.form.html,如果存在就会被渲染。
如果视图模块的“脚本”模板不存在,则页面 HTML 中不会输出任何内容。
查看模块
对于在布局模板中使用render_existing/3 的第一个示例,您需要将这样的代码添加到帖子视图模块中:
def render("scripts.html", _assigns) do
~E(<script src="file.js"></script>)
end
...第二次您将添加如下代码:
def render("scripts.show.html", _assigns) do
~E(<script src="show-file.js"></script>)
end
def render("scripts.index.html", _assigns) do
~E(<script src="index-file.js"></script>)
end
详情
render_existing 和render 之间的区别在于,如果引用的模板不存在,前者不会引发错误(在这种情况下,页面 HTML 中也不会输出任何内容)。
The ~E sigil 提供“源文件中的 HTML 安全 EEx 语法”并且类似于(在大多数情况下,甚至可能总是)来自cmititiuc's answer 的相应代码:
~s{<script>require("web/static/js/posts").Post.run()</script>}
|> raw
结论
一般来说,对于您想要通过页面head(或body 的末尾)中的script 元素导入特定JavaScript 文件的任何页面,或链接CSS 文件,或执行任何操作对于页面输出的一部分,否则由布局处理,您可以在上面的布局模板中使用render_existing,然后在这些页面的视图模块中实现适当的render 子句。
此外,您没有理由不能使用上述两个示例中的 both 之类的东西,因此对于任何视图模块及其模板,您都可以:
- 为所有视图模块模板(但不是整个应用程序的所有模板)包含一些脚本(或 CSS 文件或以其他方式操作布局模板中的 HTML 输出)李>
- 只为一个模板包含一些脚本(或...)