18

我正在使用 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吗?

最好的问候,六。

4

6 回答 6

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!

所以,它工作正常。

于 2012-10-08T19:36:13.623 回答
6

至少在 Express 4+ 中,partials 是开箱即用的。您可以将 express-generator(来自 npm)与 --hogan 或 -H 选项一起使用。

之后,您需要将部分添加到渲染方法:

router.get('/', function(req, res, next) {
  res.render('index', 
        { 
            title: 'My Site',
            partials: {header: 'header'} 
        });
});

然后,在您的模板中使用 {{ > xxx }}

<body>
  {{> header }}
  <h1>{{ title }}</h1>

  <p>Welcome to {{ title }}</p>
</body>

注意:这在视图中有 header.hjs

于 2015-09-09T10:14:36.420 回答
4

要在 express+hogan 中使用 partials,只需执行以下操作:

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 (mustache) 将其解析为 HTML 而不是字符串!

就是这样。

于 2014-06-19T08:41:23.490 回答
3

至于您的部分问题,如果您使用consolidate.js,您可以简单地执行以下操作:

res.render('index', {
  partials: {
    part  : 'path/to/part'
  }
});
于 2012-12-31T12:20:12.293 回答
2

这是个问题。在 Express 3 中很难获得部分支持。

你最好的选择是: https ://github.com/visionmedia/consolidate.js npm install consolidate

这些补丁采用不同的方法为 Hogan 添加局部:

不幸的是,引擎本身没有基于文件系统的部分的钩子,所以我认为人们对如何以及在哪里实现部分感到困惑。我最终使用了 LinkedIn 的 Dust.js 实现,因为已经有了部分支持。Master其实有更好的支持,加上我昨天提交了相对路径的补丁。

乔什

于 2012-10-08T14:53:09.283 回答
2

我会使用mmm而不是hjs.

https://github.com/techhead/mmm

免责声明:我写了这个包。

只需替换所有出现的hjswithmmm和 partials 即可开始工作。上面的链接中有更多信息和示例。

至于您的另一个问题,如果您想在多个视图中共享属性,您有几个选择。

当您调用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 视图引擎。

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

于 2012-10-13T20:13:50.193 回答