在节点js应用程序

时间:2017-01-30 08:21:07

标签: javascript node.js express-handlebars registerhelper

我的节点js应用程序有以下代码,其中我试图注册一个把手if-else逻辑,以便在我的模板文件中使用它。但是它会抛出错误" TypeError:hbs.registerHelper不是函数"。任何人都可以指出我所犯的错误,并建议如何注册if - elseif -else逻辑来执行相等(或比较)检查以在我的模板中构建决策逻辑?

package.json中的express-handlebars版本是3.0.0

var exp = require('express');
var pth = require('path');
var fcon = require('serve-favicon');
var logger = require('morgan');
var cp = require('cookie-parser');
var bp = require('body-parser');
var exphbs = require('express-handlebars');

var index = require('./routes/index');

var app = express();

exphbs.registerHelper("if", function(conditional, options) {
  if (options.hash.desired === options.hash.type) {
    options.fn(this);
  } else {
    options.inverse(this);
  }
});

// view engine setup
app.engine('hbs', exphbs({extname: 'hbs', defaultLayout: 'layout', layoutsDir: __dirname + '/views/mylayouts/'}));
app.set('views', pth.join(__dirname, 'views'));
app.set('view engine', 'hbs');

1 个答案:

答案 0 :(得分:1)

助手只能注册快递把手:

var hbs = exphbs.create({
    // Specify helpers which are only registered on this instance.
    helpers: {
        foo: function () { return 'FOO!'; },
        bar: function () { return 'BAR!'; }
    }
});

或者,如果您想将它们注册为动态。您可以像这样使用实例引用:

hbs.handlebars.registerHelper("superHelper", () => 42);

进一步移动您可能希望在渲染级别覆盖帮助器。你可以这样做:

app.get('/', function (req, res, next) {
    res.render('home', {
        showTitle: true,

        // Override `foo` helper only for this rendering.
        helpers: {
            foo: function () { return 'foo.'; }
        }
    });
});

来源:projects github page

编辑:

添加if助手:

app.engine('hbs', exphbs({
  extname: 'hbs', 
  defaultLayout: 'layout', 
  layoutsDir: __dirname + '/views/mylayouts/',
  helpers: {
    if: function(conditional, options) {
      if (options.hash.desired === options.hash.type) {
        options.fn(this);
      } else {
        options.inverse(this);
      }
    }
  }
}));