我正在尝试使用Temple Elixir库,并遇到一些带有逃脱价值的麻烦。
基本上我有一些我不想被逃脱的文本,只是在原始状态下添加。
例如,在我的控制器中:
conn
|> assign(:scripts_js, "alert('ok')")
然后在模板中我做:
script do
text @scripts_js
end
howere的结果是:
<script>alert('ok')</script>
我也尝试了partial
:
script do
partial @scripts_js
end
,但结果也被逃脱了。
我如何在坦普尔的模板中插入未设计的文本?我应该将自定义组件用于该组件,或者库以某种方式支持它?
注意:这里的JavaScript只是一个示例。我不是在寻找有关如何将JS插入页面的答案(使用SRC ATTR的脚本标签可以正常工作(。我需要知道的是要插入一个无用的字符串,它可能是JS,CSS,HTML或其他任何内容。
您可以将JS放入文件中,然后在模板中使用:
script type: "text/javascript", src: @js_path
在您的控制器中的操作中,您将写下:
def my(conn, _params) do
render(conn,
"my.html", #template
js_path: Routes.static_path(conn, "/js/my.js") #path to js file
)
end
在js/app.js
的底部,您会写:
import "./my.js"
然后用内容创建文件js/my.js
:
alert("ok");
您遇到的问题是因为Temple的text()
功能/宏在字符串上调用Phoenix.HTML.html_escape()
。不幸的是,text()
返回:ok
,而不是实际文本,否则您只需将text()
的返回值通过HmtlEntities.decode()
之类的内容输送,以使原始字符串恢复。
我直接在temple github问题中问了这个问题,并从@mhanberg那里得到了答案。因此,基本上要在模板中放置一个未设计的文本,我们应该使用以下方式:
partial Phoenix.HTML.raw("<div>Unescaped content!</div>")
# alternative approach, since all Phoenix.HTML.raw does is mark it as :safe
partial {:safe, "<div>Unescaped content!</div>"}
为了回答最初的问题,正确的结构将是:
script do
partial Phoenix.HTML.raw(@scripts_js)
end