Express-hbs:具有选项/ attrs的异步助手

时间:2014-05-22 16:59:00

标签: javascript node.js express handlebars.js

我正在使用express-hbs和Async Helpers,但我需要向帮助程序发送选项,但异步帮助程序不支持此功能(或者我不知道如何)。 正如您所看到的(下面的代码)我正在尝试加载ADS帮助器/组件,但我需要根据方向的尺寸发送额外的信息/ attrs进行渲染。

的JavaScript

hbs.registerAsyncHelper( 'ads', function(filename, cb, options) {

       // options: is undefined

      // LOAD ADS FROM REMOVE SERVER.
       cb( new hbs.SafeString( ' == ADS  == ' ) );
});

HTML

{{{ads'page-x', 'vertical', '256x56' }}

任何人都可以帮我解决这个问题吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

简短的回答,你现在可以(v0.7.10)只在express-hbs中提供一个参数。

我能想到的唯一解决方法是将JSON字符串用作param,然后使用JSON.parse()在helper函数中再次使用它们。 这仅适用于静态参数。

e.g:

hbs.registerAsyncHelper( 'ads', function(arg, cb) {
    var options  = JSON.parse(arg);
    console.log(options);
    // LOAD ADS FROM REMOVE SERVER.
    cb( new hbs.SafeString( ' == ADS  == ' ) );
});

{{{ads "[\"page-x\",\"vertical\",\"256x56\"]" }}}

在express-hbs中出现多个args问题的原因如下:

TL;博士

express-hbs registerAsyncHelper代码:

ExpressHbs.prototype.registerAsyncHelper = function(name, fn) {
    this.handlebars.registerHelper(name, function(context) {
        return async.resolve(fn.bind(this), context);
    });
};

仅使用handlebars.registerHelper注册一个参数(上下文),但是把手将使用每个提供的参数作为额外参数调用已注册的助手。所以注册的函数应该如下所示:

ExpressHbs.prototype.registerAsyncHelper = function(name, fn) {
    this.handlebars.registerHelper(name, function(contextArgs) {
        return async.resolve(fn.bind(this), Array.prototype.slice.call(contextArgs));
    });
};

但这也需要更改解析功能。所以你必须等待修复或自己解决,我想。

同样如下面的评论中提到的那样,句柄中多个参数的正确语法是不使用逗号。所以你的模板应该是这样的(当把手-hbs固定时):

{{{ads 'page-x' 'vertical' '256x56'}}}