如何在Elixir Temple模板中插入未设计的文本



我正在尝试使用Temple Elixir库,并遇到一些带有逃脱价值的麻烦。

基本上我有一些我不想被逃脱的文本,只是在原始状态下添加。

例如,在我的控制器中:

conn
  |> assign(:scripts_js, "alert('ok')")

然后在模板中我做:

script do
  text @scripts_js
end

howere的结果是:

<script>alert(&#39;ok&#39;)</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

相关内容

  • 没有找到相关文章

最新更新