Phoenix Framework Elixir:如何在javascript中使用辅助函数

时间:2017-05-24 00:00:00

标签: elixir phoenix-framework

我在视图中定义了一个辅助函数:

def usernames(id) do
  post = Repo.get(Post, id) |> Repo.preload(comments: :user)
  usernames = for comment <- post.comments do
     comment.user.username
  end
end

然后在javascript文件中我做:

$('#comment').doThis({
   data: "<%= escape_javascript( MyApp.ApplicationHelpers.usernames(@post.id) ) %>"
});

以上不起作用。当然我需要能够传递@ post.id,但即使通过硬编码MyApp.ApplicationHelpers.usernames(5)等帖子ID,也无法正常工作。

基本上我正在尝试将Rails等效于:

@usernames = User.pluck(:username)

然后在js.erb中就是:

data = <% @usernames %>
$('#comment').doThis({'data': data});

如果有人可以帮忙解决这个问题......

更新:(提供更多信息) 我将javascript代码放在posts.js中,如下stackoverflow answer。该文件中的其他javascript代码将根据需要执行。

1 个答案:

答案 0 :(得分:2)

好吧@codibgbear就是这样,凤凰将把它作为常规js文件,这样它就不会编译代码,这意味着你的EEX语法不会起作用。

您可以做的是定义名为_scripts.html.eex的模板旁边的部分,并添加以下代码

<script>
  $('#comment').doThis({
    data: "<%= escape_javascript(usernames(@post.id)) %>"
  });
</script>

然后在您的模板上,确保渲染此部分。

<%= render "_scripts.html", post: @post %>

实际上,你应该查看你的templates/layout/app.html.eex文件,看看是否有一行已经神奇地渲染这个文件;)

该行应如下所示:

<%= render_existing view_module(@conn), "_scripts.html", assigns %>

由于您在视图中定义了usernames/1函数,因此您不需要使用整个模块名称,所以我认为这应该可行。

祝你好运!