【问题标题】:Accessing passed EJS variable in Javascript file访问 Javascript 文件中传递的 EJS 变量
【发布时间】:2019-10-23 14:55:29
【问题描述】:

RESTful 路由js文件:

// index route - show all todos
router.get("/", middleware.isLoggedIn,function(req,res) {
  Todo.find({ "author.id" : req.user._id}, function(err, allTodos) {
    if(err) {
      console.log(err);
    } else {
      res.render("todo/index", {todos: allTodos});
    }
  });        
});

我的 index.ejs 文件有:

<script src="/scripts/todoCalendar.js"></script>

body 标记的末尾,我想在我的 todoCalendar.js 文件中访问传递的变量todos。 我试着把

<script>
  var x= <%= todos %>
</script>

但当我尝试在我的 todoCalendar.js 文件中执行 console.log(x) 时,它说 x 未定义。

非常感谢任何帮助。

【问题讨论】:

  • 是 todos ejs 变量,具有可以使用 &lt;%=todos | json&gt; 调试的数据

标签: javascript node.js express


【解决方案1】:

解决问题的三种方法...

  1. 变体

    <script>
        var x = "<%= todos %>";
        console.log(x); 
    </script>
    
  2. 变体

    <script>
        var x = "<%- todos %>";
        console.log(x); 
    </script>
    
  3. 变体 [XD]

    HTML:

    <p id="yy" style="display:none"><%= todos %></p>
    

    Javascript:

    <script>
        var x = document.getElementById("yy").innerText;
        console.log(x); 
    </script>
    

【讨论】:

  • 这对我不起作用!错误未捕获类型错误:无法读取 null 的属性“innerText”
  • 声明这样的数组是行不通的。请指导
  • Prathamesh,尝试使用 innnerHTML
  • 我有一个非常相似的案例,方法 3 似乎可以很好地呈现变量,但我需要通过方法 1 或 2 访问该变量,以便我可以访问标签内的变量...我的沮丧,在我的浏览器控制台中得到 Uncaught SyntaxError: Invalid or unexpected token。注意:我需要的变量包含一个对象数组。
  • 我正在将一个对象传递给脚本。为了让它工作,我调整了#2,在将对象传递给模板时使用 JSON.stringify() ,然后在变量上使用反引号和更危险的非转义标签 let x = JSON.parse(`<%- myObject %>`);
【解决方案2】:

通过格式化您从服务器获得的 JSON 的 html 打印并使用 javascript(我的案例 jQuery)来检索该文本、存储它并从 html 中删除它:)

EJS:

<span id='variableJSON' hidden>
    <%= JSON.stringify(passedInEjsVariable); %>
</span>

JavaScript:

var variableJSON = JSON.parse($('#variableJSON').text());
$('#variableJSON').remove();

【讨论】:

  • 这是一个被严重低估的答案。
  • 不错的破解!这应该是公认的答案,当前评分最高的答案不适用于对象。
【解决方案3】:

只有这在我的情况下有效。所有带有 "" 或带有

<script>
  var todos = <%-JSON.stringify(todos)%>;
  for (var item of todos) {
    console.log(item)
  }
</script>

注意事项:如果使用 VS Code 格式保存 .ejs 文件, 会拆分为 你得到 Uncaught SyntaxError: Unexpected token ';' 并且一秒钟前有效的东西突然停止工作。

【讨论】:

    【解决方案4】:

    http://ejs.co/

    你可以尝试在 ejs 中使用

    【讨论】:

    • 我在&lt;script&gt; 标签内尝试了&lt;%=&lt;%-,但它们不起作用。控制台显示“无效或意外令牌”。出于某种原因,&lt;%- 语法在我的script 标记内没有做任何事情。当然,当我查看源代码 (Ctrl + u) 时,当我使用 &lt;%-&lt;%= 时,我可以看到打印出的 todosvar x = {obj}
    • res.locals.todo = JSON.stringify(object);
    • res.render("test",{ 'todos': JSON.stringify({a:1}) }); 然后&lt;script&gt; var x= &lt;%- todos %&gt; &lt;/script&gt;
    • 我更喜欢在 ejs 中进行字符串化,而不是在路由器中,以保持我的对象在视图中可访问。您可能想要使用对象属性,如果您已经对其进行了字符串化,那将是一个问题。所以在 ejs &lt;script&gt; 标签中就可以:var x= &lt;%- JSON.stringify(todos) %&gt;;
    【解决方案5】:

    恐怕您不能在扩展名为 .js 的文件中使用 EJS 标记。

    如果把js代码放在EJS文档的最下面,就没有问题了。

    在后端你做:

    res.render('todo/index', {todos: JSON.stringify(alltodos)}); 
    

    在你的 ejs 文件中你做:

    <script>
     var x= <%- todos %>;
     console.log(x);
    </script>
    

    这很好用。我刚刚测试了我的项目。

    如果您想在带有 .js 扩展名的单独文件中使用相同的代码,它将不起作用。您在浏览器控制台中收到“意外令牌

    您唯一的选择是将 todos 打印到 ejs 文件内的隐藏 DIV 中,然后通过 javascript 进入(您可以使用 innerText 或 innerHTML)并将其存储在变量中。有点hacky,但它可以解决问题。

    【讨论】:

    • 这可以通过将 .js 文件内容包含在
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 2012-07-02
    • 1970-01-01
    • 2020-04-15
    • 2018-03-20
    • 1970-01-01
    相关资源
    最近更新 更多