Node.js + Express + Handlebars.js +部分视图

时间:2013-05-05 13:48:11

标签: node.js express handlebars.js partial-views

我正在尝试使用Handlebars.js作为服务器模板引擎,使用Node.js | Express创建一个简单的HelloWorld项目。

问题在于我无法找到使用此类链的任何示例,尤其是多视图。

例如,我想定义标题视图:

<header>
  <span>Hello: {{username}}</span>
</header>

并在包含其他视图的每个页面中使用它。

也许我正在以错误的方式思考这些观点,我认为该观点是一种控制,我可以在任何其他视图中的任何页面上重复使用。

我感谢任何可以从中学习的教程或(更好)开源项目的链接。

5 个答案:

答案 0 :(得分:42)

我知道很久以前就已经问过了这个问题,但没有人在这篇文章中找到答案。所以我会在这里这样做。为了确保每个人都在同一页面上,我的答案将会冗长。如果它看起来过于简单,我会提前道歉。

在您的server.js文件(或app.js中,无论您将把手定义为视图引擎的位置)。根据您使用的npm包装,例如hbs或快速把手等,它可能看起来不同,但与此类似。注意:我在这个例子中使用快速把手。

file:server.js

...
var express     = require( 'express'),
    hbs         = require( 'express-handlebars' ),
    app         = express();
...

app.engine( 'hbs', hbs( { 
  extname: 'hbs', 
  defaultLayout: 'main', 
  layoutsDir: __dirname + '/views/layouts/',
  partialsDir: __dirname + '/views/partials/'
} ) );

app.set( 'view engine', 'hbs' );

...

,您的文件结构应如下所示:

| /views/   
|--- /layouts/
|----- main.hbs
|--- /partials/
|----- header.hbs
|----- footer.hbs
|----- ... etc.
|--- index.hbs
| server.js

您的main.hbs文件应如下所示:

file:main.hbs

...
{{> header }}
...
<span> various other stuff </span>
...
{{> footer }}

要表示部分使用此语法:{{> partialsNames }}

答案 1 :(得分:35)

使用https://www.npmjs.org/package/hbs | https://github.com/donpark/hbs

我们假设你有:

+ views
  - index.hbs
  + partials
    - footer.hbs

您需要注册哪个文件夹包含您的部分内容:

hbs.registerPartials(__dirname + '/views/partials');

部分将具有文件的确切名称。您还可以使用以下命令为部分注册特定名称:

hbs.registerPartial('myFooter', fs.readFileSync(__dirname + '/views/partials/footer.hbs', 'utf8'));

然后你这样访问它:

First example: {{> footer }} 
Second example: {{> myFooter }}

此处的完整示例:https://github.com/donpark/hbs/tree/master/examples/partial

答案 2 :(得分:2)

我目前正在使用ericf实施的“Handlebars-express”,并发现它非常出色:

https://github.com/ericf/express3-handlebars

要记住的关键是,在快递上,与浏览器内部相反,把手在视图渲染阶段被激活。客户端代码最终只是纯HTML,就好像你在PHP上下文中使用了胡子一样。

答案 3 :(得分:1)

你需要使用部分内容。

有关使用partials的一个好例子,请参阅https://github.com/donpark/hbs/tree/master/examples/partial

这是另一个例子http://blog.teamtreehouse.com/handlebars-js-part-2-partials-and-helpers

答案 4 :(得分:0)

如果您当前的目录是这样的,

| /public/   
| /views/ 
|--- /layouts/
|----- main.hbs 
|--- /partials/ 
|----- header.hbs 
|----- footer.hbs 
|----- sidebar.hbs 
|--- index.hbs 
| app.js 

然后,app.js的结构将为

const express = require('express');
const app = express();
const port = 3001;
const path = require('path');
const handlebars = require('express-handlebars');

app.use(express.static(path.join(__dirname, 'public'))); 

app.set('view engine', '.hbs');
app.engine('.hbs', handlebars({
    layoutsDir: __dirname + '/public/views/layouts',
    defaultLayout: 'main',
    extname: 'hbs', 
    //for partial directory
    partialsDir : __dirname+'/public/views/partials',
}));

app.set('views', path.join(__dirname, '/public/views'));

app.get('/', (req, res) => {  
    res.render('index');
});

app.listen(port, () => console.log(`App listening to port ${port}`));

按如下所示设置main.hbs

const express = require('express');
{{> header}}
{{> sidebar}}
<p>Your Content(static) or you can use {{{body}}} </p>
{{> footer}}