【问题标题】:add variable on ejs include在 ejs 上添加变量包括
【发布时间】:2018-02-04 00:39:35
【问题描述】:

我正在尝试根据博客的 name 使用来自 ejs 的 include 加载博客部分。

来自 data.json 的数据:

"blogs" : [{
    "title" : "Git Basics",
    "name" : "git_basics",
    "date" : "February 8, 2015",
    "category" : "git",
  },{
    "title" : "Javascript Basics",
    "name" : "javascript_basics",
    "date" : "December 31, 2014",
    "category" : "javascript"
  },{
    "title" : "Html5 Communication",
    "name" : "html5_communication",
    "date" : "November 25, 2014",
    "category" : "html5"
  }]    

路线:

/* GET blog page. */
router.get('/blog', function(req, res) {
  var blogswithDetail = [];
  for(var i=0; i<appdata.blogs.length && i<4; i++){
    blogswithDetail.push(appdata.blogs[i]);
  }

  res.render('blog', { 
    title: 'Blog',
    blogswithdetail: blogswithDetail
  });
});

页面:

<% blogswithdetail.forEach(function(item){ %>
    <article id="<%= item.name %>">
        <h2><%= item.title %></h2>
        <p><%= item.date %></p>
        <%= item.detail %>
    </article>
    <% include partials/content/blog_(item.name).ejs %>
<% }); %>

&lt;% include partials/content/blog_(item.name).ejs %&gt;这行代码不正确。 我的问题是如何将item.name插入include,这样我就可以根据item.name的变化包含不同的部分

【问题讨论】:

  • 您能否提供更多详细信息。你想问什么不是很清楚。
  • @NarendraSoni 谢谢。我已经指定了我的问题。你有什么想法吗?
  • @NarendraSoni 我再次添加了更多细节。请帮我。谢谢。

标签: node.js express ejs


【解决方案1】:

我认为您误解了 ejs 的工作原理。 ejs 接受提供的参数,并将标签替换为参数:

node.js:

res.render('test.ejs', {a: 'hello', b: 'world', c: 42});

test.ejs:

<%= a %><%= b %><br>
The answer to life, universe and everything else is <%= c %>

结果:

helloworld<br>
The answer to life, universe and everything else is 42

你可以传递对象:

res.render('test.ejs', {a: {a: 'a', b: 'b'}});

但是你不能使用对象的一个​​属性,只能使用整个对象。

在你的情况下,你应该这样做:

节点:

var item = {name: 'name', title: 'title', date: 'date', details: 'details'};
res.render('test.ejs', item);
//Or
//res.render('test.ejs', {name: item.name, title: item.title...

ejs:

<% blogswithdetail.forEach(function(item){ %>
    <article id="<%= name %>">
        <h2><%= title %></h2>
        <p><%= date %></p>
        <%= detail %>
    </article>
    <% include partials/content/blog_(<%= name %>).ejs %>
<% }); %>

或者:

<% blogswithdetail.forEach(function(){ %>
    var item = JSON.parse(<%= item %>);
    <article id="item.name">
        <h2>item.title</h2>
        <p>item.date</p>
        item.detail
    </article>
    <% include partials/content/blog_(item.name).ejs %>
<% }); %>

节点:

res.render('test.ejs', {item: JSON.stringify(item)});

【讨论】:

  • 非常感谢。但实际上我可以使用对象的属性。当我删除这行代码&lt;% include partials/content/blog_(item.name).ejs %&gt;时,页面就可以正确呈现了。所以我认为这行代码的语法是不正确的。问题是我不知道如何将item.name 插入include
  • 我添加了有关该问题的更多详细信息。你能多花点时间帮我解决问题吗。谢谢
【解决方案2】:

我认为你在这里错过了诀窍。当我们开发任何 Web 应用程序时,我们应该尝试使其动态化。过去我们拥有 100 多个 HTML 并根据路由加载它们的日子已经一去不复返了,这基本上称为静态 Web。

我从您的问题中了解到,您正在尝试根据参数值加载特定的 EJS 模板。试想一种情况,随着时间的推移,您的项目会变得越来越大,您的参数值和每个特定参数都将创建一个与其他模板没有太大区别的新 EJS 模板。将有 100 多个文件难以管理。

所以我建议你以正确的方式使用模板。只需包含一个 EJS 模板并在其中使用表达式来区分您的item.name 并根据需要呈现视图。当然,您必须明智地使用它,如果您认为有机会简化使用,应该将模板拆分为更小的模板并重新使用现有的模板。

示例:

<%if (item.name == 'xyz') { %>
// Do something 
<% } %>

【讨论】:

  • 我只是在建立一个小网站来管理我自己的科技博客。因为技术博客有很多代码和不同的结构,我不知道如何将它们存储到数据库中。所以我把每个博客的内容都分成了部分,我认为这是一种更容易处理的方法。我想不出更好的方法来管理它们。如果你有什么好主意。请告诉我。谢谢
  • 由于您正在研究 Node 和 EJS,我建议您选择 MEAN(Mongo、Express、Angular、Node)。将 express 作为 Rest Engine 和 Angular JS 用于所有前端路由和视图逻辑。我相信你会喜欢这个的。例如看起来here
  • 谢谢。这就是我正在努力学习的。这样一来,我应该把我的博客内容存储到 MongoDB 中,对吧?但是在技术博客中,&lt;pre&gt;&lt;code&gt; 之间的一些代码应该以原始形式存储,我该如何在数据库中做到这一点?
猜你喜欢
  • 2014-01-30
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 2014-07-10
  • 2021-10-25
  • 1970-01-01
相关资源
最近更新 更多