部分使用Node.js + Express + Hogan.js

时间:2012-10-08 14:18:44

标签: javascript node.js express viewengine hogan.js

我正在开发一个使用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.

我有两个问题:

  1. 如何正确使用页面中的部分内容? (此代码不起作用)
  2. 我可以为两个或更多页面使用相同的“标题”而不重复文件/routes/index.js中的值分配吗?
  3. 最好的问候,Vi。

6 个答案:

答案 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.htmlpart.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.localsapp.locals,然后才会传递到呈现引擎。因此,要设置应用范围的属性,只需将其分配给app.locals

app.locals.title = "Default Title"; // Sets the default title for the application

这个概念实际上适用于任何Express 3 View Engine。

但是,对于mmm具体而言,请参阅“演示逻辑”下的部分,了解将值绑定到模板或模板集的更多方法。