将数据从 Phoenix 传递到 Javascript 的最佳实践

Cha*_*Han 8 elixir phoenix-framework

我看到了 3 种方法。

  1. 使用<%= %>内部<script>*.html.eex
  2. 使用通道将数据传递给 Javascript
  3. 构建一个 json api

#1 似乎是最简单的,但我还没有找到或想出一个好的方法来做到这一点。

注意:实时更新不是我的要求。

Jer*_*Ges 6

我永远不会<script></script>为此使用 a ,在我的项目中我有这种模式:

<!-- Layout -->
<div id="config"
  data-environment="..."
></div>
Run Code Online (Sandbox Code Playgroud)

我总是在主布局中提供当前环境,我有一个config.js包含正确环境的正确数据的文件。

当我需要将一些数据传递给我的 javascript 时,我会做类似的事情:

<div id="app"
  data-users="..."
  data-zombies="..."
  ...
></div>
Run Code Online (Sandbox Code Playgroud)

如果你用一些助手(长生不老药方面)抽象它,你可以这样做:

<%= App.Helpers.make_html(:app, [users: @users, zombies: @zombies]) %>
Run Code Online (Sandbox Code Playgroud)

在 javascript 方面,当我加载页面时,我只是提取data-属性并将它们设置在options当前控制器的变量中:

<%= App.Helpers.make_html(:app, [users: @users, zombies: @zombies]) %>
Run Code Online (Sandbox Code Playgroud)

好吧,这只是一个示例,您应该将其调整为您当前的项目。关键是抽象。

希望能帮助到你 :)


Dog*_*ert 5

(2) 如果您不想实时更新,则不是一个好主意。(3) 如果您不想使用 AJAX 加载数据,可能会过于复杂。如果您只需要可以从 JS 访问一些数据并且不想在不重新加载整个页面的情况下更改它,则应该使用 (1)。

由于有效的 JSON 也是有效的 JS,因此您可以使用Poison.encode!(). 如果您的数据在 中@posts,您可以在*.html.eex

<script>
  var POSTS = <%= Poison.encode!(@posts) %>;
</script>
Run Code Online (Sandbox Code Playgroud)

然后在此之后加载其他 JS 并使用全局POSTS变量访问帖子。(您可能希望将其命名空间为App.posts = ...

<script>
  var App = window.App || {};
  App.posts = <%= Poison.encode!(@posts) %>;
</script>
Run Code Online (Sandbox Code Playgroud)

确保@posts只包含可以转换为 JSON 的数据(没有元组)并且只包含允许用户查看的字段。