我有一个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;之间的值没有得到评估。为什么不?有什么选择? 请注意,我将变量传递给网址。
答案 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包中的路由逻辑。
我确定我现在还没有想到更多的选择。