【问题标题】:Using Layouts with Express 3.x在 Express 3.x 中使用布局
【发布时间】:2012-11-06 05:00:12
【问题描述】:

我发现的所有指南似乎都引用了 Express 的早期版本,据我了解,此功能从 2.x 到 3.x 有所改变。我假设由于npm install express 当前安装的是 3.0.3 版本,因此 3.x 被认为是稳定的并且可以用于生产。 (不是这样吗?)

我想使用 EJS 或 Kiwi 模板,如果可能的话,我想在模板中使用 Underscore。

但我的第一个障碍是获得围绕我的内容/部分呈现的布局。

给定:

$ express --ejs test

index.js:

exports.index = function(req, res){
  res.render('index', { title: 'test' });
};

我已经创建了 layout.ejs,但是当我查看源代码时可以看到它没有被调用。

在 Express 3.x 中布局是否已完全传递给模板库来处理(因此,如果选择的模板库没有实现它们,那么您就是 SOL)?

如果它仍然是 Express 的一部分,我该如何配置它?如果它必须由模板库实现,我在 EJS 或 Kiwi 文档中都看不到布局说明——这是否意味着它们根本不受支持?

【问题讨论】:

标签: node.js express


【解决方案1】:

使用 ejs-locals 获得布局支持(也提供块和部分)...因为布局已在 express 3.x 中删除。

https://github.com/RandomEtc/ejs-locals

从示例中运行 node app.js 并打开 localhost:3000 以查看一个工作示例。

给定一个模板,index.ejs:

<% layout('boilerplate') -%>
<% script('foo.js') -%>
<% stylesheet('foo.css') -%>
<h1>I am the <%=what%> template</h1>
<% block('header', "<p>I'm in the header.</p>") -%>
<% block('footer', "<p>I'm in the footer.</p>") -%>

还有一个布局,boilerplate.ejs:

<!DOCTYPE html>
<html>
  <head>
    <title>It's <%=who%></title>
    <%-scripts%>
    <%-stylesheets%>
  </head>
  <body>
    <header>
      <%-blocks.header%>
    </header>
    <section>
      <%-body -%>
    </section>
    <footer>
      <%-blocks.footer%>
    </footer>
  </body>
</html>

【讨论】:

  • 这可行(谢谢!)但在布局中使用 &lt;%- body -%&gt; 似乎与名为 body 的局部变量(如果它存在)冲突。所以如果我res.render('myview', { body: 'content' }),视图本身不会呈现,只有布局文件呈现,用“内容”代替&lt;%- body -%&gt;标签。我可以在布局中使用“body”以外的东西吗?
  • 不确定,您可以向 github 项目提交问题。但是为什么要将 { body: 'content' } 传递给您的视图 - 通常您只会传递视图使用的数据?
  • 想将一个名为“body”的变量传递给视图是不是很不合理?很多东西都有实体,根据我的经验,这是一个相当常见的变量名。它实际上只是我的视图中使用的一条信息——我并没有试图传递一些预渲染的视图块或任何东西。
  • 我建议您将其命名为content 而不是body,因为ejs 布局保留了生成html 的主体。另外,我问的原因是你的内容看起来是 HTML ......整个观点是你将标记和数据分开。
  • 是什么让你认为我的内容是 html?不是,而且我认为我没有发布任何表明它是...
猜你喜欢
  • 1970-01-01
  • 2012-09-18
  • 2012-10-18
  • 2015-04-08
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多