我正在开发一个使用Node.js + Express并使用视图引擎Hogan.js的网站。
这是我的档案app.js
:
/**
* Module dependencies.
*/
var express = require('express')
, routes = require('./routes')
, user = require('./routes/user')
, http = require('http')
, path = require('path');
var app = express();
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'hjs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser('your secret here'));
app.use(express.session());
app.use(app.router);
app.use(require('less-middleware')({ src: __dirname + '/public' }));
app.use(express.static(path.join(__dirname, 'public')));
});
app.configure('development', function(){
app.use(express.errorHandler());
});
app.get('/', routes.index);
app.get('/about', routes.about);
app.get('/users', user.list);
http.createServer(app).listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));
});
文件/routes/index.js
是:
/*
* GET pages.
*/
exports.index = function(req, res){
res.render(
'index',
{
title: 'Home Page',
author: 'Bruce Wayne'
}
);
};
exports.about = function(req, res){
res.render(
'about',
{
title: 'About Page',
author: 'Bruce Wayne'
}
);
};
在/views
文件夹中,有:
| - part.hjs
| - index.hjs
| - cv.hjs
文件part.hjs
是:
<h3>Hello {{ author }}</h3>
文件index.hjs
是:
<h1>Title: {{ title }} </h1>
{{> part }}
Welcome to Gotham City.
文件about.hjs
是:
<h1>Title: {{ title }}</h1>
{{> part }}
I'm not Joker.
我有两个问题:
/routes/index.js
中的值分配吗?最好的问候,Vi。
答案 0 :(得分:25)
我找到了第一个问题的解决方案。
首先,我删除了hjs
:
npm remove hjs
然后,我安装了包hogan-express
:
npm install hogan-express
此外,我编辑了app.js
:
/**
* Module dependencies.
*/
var express = require('express')
, routes = require('./routes')
, user = require('./routes/user')
, http = require('http')
, path = require('path');
var app = express();
app.engine('html', require('hogan-express'));
app.enable('view cache');
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'html');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser('your secret here'));
app.use(express.session());
app.use(app.router);
app.use(require('less-middleware')({ src: __dirname + '/public' }));
app.use(express.static(path.join(__dirname, 'public')));
});
app.configure('development', function(){
app.use(express.errorHandler());
});
app.get('/', routes.index);
app.get('/users', user.list);
http.createServer(app).listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));
});
routes/index.js
:
exports.index = function(req, res) {
res.locals = {
title: 'Title',
};
return res.render(
'index',
{
partials:
{
part: 'part',
}
}
);
};
现在,在/views
中有index.html
,part.html
。
文件part.html
包含:
<h1>{{ title }}</h1>
文件index.html
包含:
{{> part}}
Hello world!
所以,它运作正常。
答案 1 :(得分:6)
至少在Express 4+中,部分只是开箱即用。您可以使用带有--hogan或-H选项的快速生成器(来自npm)。
执行此操作后,您需要向渲染方法添加部分:
router.get('/', function(req, res, next) {
res.render('index',
{
title: 'My Site',
partials: {header: 'header'}
});
});
然后,在您的模板中使用{{&gt; xxx}}
<body>
{{> header }}
<h1>{{ title }}</h1>
<p>Welcome to {{ title }}</p>
</body>
注意:这在视图中有header.hjs
答案 2 :(得分:4)
要使用express + hogan的部分,请执行以下操作:
app.get('/yourRoute', function(req, res){
res.render('yourPartial', function(err,html){
var partialHTML = html;
res.render('yourMainView', { myPartial: partialHTML }, function(err,html){
res.send(html);
});
});
}
现在,yourMainView.html:
<p>Something Something Something</p>
{{{partialHTML}}}
<p>Bla Bla Bla</p>
注意三倍'{'而不是像往常一样加倍!告诉hogan(胡子)将其解析为HTML而不是字符串!
就是这样。
答案 3 :(得分:3)
至于你的局部问题,如果你使用consolidate.js,你可以这样做:
res.render('index', {
partials: {
part : 'path/to/part'
}
});
答案 4 :(得分:2)
这是一个问题。在Express 3中很难获得部分支持。
你最好的选择是:
https://github.com/visionmedia/consolidate.js
npm install consolidate
这些补丁采用不同的方法为Hogan添加部分:
不幸的是,引擎本身没有基于文件系统的部分内容的钩子,所以我认为人们对应该如何以及在何处实现部分内容感到困惑。我最终得到了LinkedIn的Dust.js实现,因为部分支持已经存在。师父实际上有更好的支持,而且我昨天提交了一份补丁,用于相对路径。
约什
答案 5 :(得分:2)
我会使用mmm
代替hjs
。
https://github.com/techhead/mmm
免责声明:我写了这个包。
只需将所有hjs
替换为mmm
,部分内容即可开始工作。上面的链接中有更多信息和示例。
至于你的另一个问题,如果你想在多个视图之间共享属性,你有几个选择。
当您致电res.render(name, options)
时,options
实际上会合并到res.locals
和app.locals
,然后才会传递到呈现引擎。因此,要设置应用范围的属性,只需将其分配给app.locals
。
app.locals.title = "Default Title"; // Sets the default title for the application
这个概念实际上适用于任何Express 3 View Engine。
但是,对于mmm
具体而言,请参阅“演示逻辑”下的部分,了解将值绑定到模板或模板集的更多方法。