一尘不染

Express.js HBS模块-从.HBS文件注册部分文件

node.js

我在express.js中使用handlebars.js
hbs包装器。我的模板可以正常工作,但是我需要添加局部视图以与视图一起呈现。

我想做这样的事情:

hbs.registerPartial('headPartial', 'header'); 
// where "header" is an .hbs file in my views folder

但是,它抛出“找不到标头部分”。

如果我将html字符串传递给第二个参数,则可以使registerPartial起作用,但是我想对局部对象使用单独的视图文件。

我还没有找到任何文档,但是希望我可能缺少一些简单的东西。

有谁知道如何在registerPartial方法中使用视图文件?如果是这样,我该如何实施?

更新

为了提供更多的上下文,让我添加更多的代码。这是我的“服务器”文件-app.js

var express = require('express')
, routes = require('./routes')
, hbs = require('hbs');

var app = module.exports = express.createServer();

// Configuration

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'hbs');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.configure('production', function(){
  app.use(express.errorHandler());
});

// this is the line that generates the error
hbs.registerPartial('headPartial', 'header');

// What I'm expecting is for "headPartial" to be a compiled template partial 
// of the template within views/header.hbs, but it is not loading this way.
// If I do something like hbs.registerPartial('headPartial', '<p>test</p>');
// then it does work. I need to know how to pass an .hbs file to the
// registerPartial method.

// Routes
app.get('/', routes.index);

app.listen(3000);

这是我的routes.index文件:

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

在我的views文件夹中,我有三个模板:

views/
  header.hbs (this is my partial)
  index.hbs
  layout.hbs

在我的index.hbs文件中,我使用以下命令调用“ headPartial”部分:

{{> headPartial}}

任何帮助是极大的赞赏。


阅读 312

收藏
2020-07-07

共1个答案

一尘不染

代码将所有部分模板加载到目录中,并使它们按文件名可用:

var hbs = require('hbs');
var fs = require('fs');

var partialsDir = __dirname + '/../views/partials';

var filenames = fs.readdirSync(partialsDir);

filenames.forEach(function (filename) {
  var matches = /^([^.]+).hbs$/.exec(filename);
  if (!matches) {
    return;
  }
  var name = matches[1];
  var template = fs.readFileSync(partialsDir + '/' + filename, 'utf8');
  hbs.registerPartial(name, template);
});
2020-07-07