如何在Node中注册和使用Handlebars助手?

时间:2014-05-14 22:25:23

标签: javascript node.js handlebars.js

我正在使用带有Node的Handlebars,并且工作正常:

require('handlebars');
var template = require('./templates/test-template.handlebars');
var markup = template({ 'some': 'data' });
console.log(markup);

工作正常。但是,我需要在模板中注册并使用自定义帮助程序。所以,现在我的代码看起来像这样:

var Handlebars = require('handlebars');

Handlebars.registerHelper('ifEqual', function(attribute, value) {
    if (attribute == value) {
        return options.fn(this);
    }
    else {
        return options.inverse(this);
    }
});

var template = require('./templates/test-template.handlebars');
var markup = template({ 'some': 'data' });
console.log(markup);

但是现在当我运行我的脚本时,我得到了

  

错误:缺少助手:'ifEqual'

那么:如何在Node中定义和使用自定义帮助程序?

2 个答案:

答案 0 :(得分:5)

我明白了。我需要这样做:

var Handlebars = require('handlebars/runtime')['default'];

真正酷的是,这甚至可以在浏览器中使用Browserify。

然而,我发现更好的方式(可能是"正确的#34;方式)是通过(shell命令)预编译Handlebars模板:

handlebars ./templates/ -c handlebars -f templates.js

然后我这样做:

var Handlebars = require('handlebars');
require('./templates');
require('./helpers/logic');

module.exports.something = function() {
    ...
    template = Handlebars.templates['template_name_here'];
    ...
};

答案 1 :(得分:1)

这是我做的方式。
我想现在它有点不同了。

const Handlebars = require('handlebars');

module.exports = function(){
    Handlebars.registerHelper('stringify', function(stuff) {
        return JSON.stringify(stuff);
    });
};

然后我制作了一个小脚本来调用所有帮助程序上的require,以便它们运行。

// Helpers Builder
let helpersPath = Path.join(__dirname, 'helpers');
fs.readdir(helpersPath, (err, files) => {
    if (err) {throw err;}
    files.filter((f) => {
        return !!~f.indexOf('.js');
    }).forEach((jsf) => {
        require(Path.join(helpersPath, jsf))();
    });
});

或简单的方式

require('./helpers/stringify')();

实际上你甚至不必把它作为一个函数导出你根本不能导出任何东西而只是从另一个js文件中调用require而不是最后的函数params。