如何在js文件中执行elixir代码?

时间:2016-12-14 06:36:29

标签: javascript elixir phoenix-framework

我有一个js" my_js_file.js"我只包含在一个页面中的文件。在那个js文件中,我需要通过调用凤凰助手来获取一个URL:

# my_js_file.js

function func1(userLogin) {
  var createUserUlr = "<%= user_home_path(@conn, :create, userLogin) %>";
  //...........

但它不起作用。 当我将其重命名为&#34; my_js_file.js.eex&#34;时,它仍然无法正常工作 - &#34;&lt;%=%&gt;&#34;之间的值没有得到评估。为什么不?有什么选择? 请注意,我将变量传递给网址。

1 个答案:

答案 0 :(得分:6)

我认为这是不可能的,因为static/目录中的资源不是由Elixir处理,而是由您的资产管道(默认情况下为Brunch)处理。它们是预编译的,因此即使它有效,您也无法访问@conn变量,因为在编译静态资产时这不可用。

请记住这是的事情!服务器不需要在每个页面请求上重新呈现您的Javascript。

您可以通过多种方式获得所需的结果:

硬编码

可能看起来很hacky,但对于简单的案例来说效果很好。我建议只对路径进行硬编码,在开始时使用//来保留当前协议(http / https)。如果您需要将其解析为完整网址,则可以使用this trick

数据属性

对于一次性使用,您可以将data attribute添加到标记的相关部分,例如登录表单:

<div id="create-user" data-url="<%= user_home_path(@conn, :create, userLogin) %>">
  <!-- ... -->
</div>

然后在JavaScript中,您可以访问数据属性。请注意,根据您的使用情况,可能有一种更好的方法来检索包含数据属性的DOM节点,而不是使用document.querySelector,这只是一个示例:

let createUserUrl = document.querySelector("#create-user").getAttribute("data-url");

如果您只需要定位IE11 +或愿意使用polyfill,您还可以使用dataset

let createUserUrl = document.querySelector("#create-user").dataset.url;

或者如果你正在使用jQuery:

let createUserUrl = $("#create-user").data("url");

如果您覆盖提交按钮的url处理程序,也许您可​​以从其他属性中提取网址,例如form的{​​{1}} ,例如。

onclick对象

上添加属性

对于真正的全局值,例如身份验证令牌等,您可以在window对象上设置属性,例如window

web/templates/layout/app.html.eex

然后在您的JavaScript中,您只需访问

即可
<script>window.userToken = "<%= assigns[:user_token] %>";</script>

其他解决方案

此问题还有更高级的解决方案,包括:

  • 添加一个单独的JSON端点,以JSON格式返回所需数据,然后可以从JavaScript中请求

  • 如果您使用诸如React.js,Vue.js等JavaScript框架,您可能可以利用框架或辅助JavaScript包中的路由逻辑。

我确定我现在还没有想到更多的选择。