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

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' }}

任何人都可以帮助我解决这种情况吗?
谢谢!

最佳答案

简短的回答,您目前 (v0.7.10) 只能在 express-hbs 中提供一个参数。

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

例如。:

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 注册一个参数(上下文),但 handlebars 将调用注册的助手,并将每个提供的参数作为额外参数。所以注册的函数应该是这样的:
ExpressHbs.prototype.registerAsyncHelper = function(name, fn) {
    this.handlebars.registerHelper(name, function(contextArgs) {
        return async.resolve(fn.bind(this), Array.prototype.slice.call(contextArgs));
    });
};

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

同样如您问题下方的评论中所述, Handlebars 中多个参数的正确语法是不使用逗号。所以你的模板应该是这样的(当 handlebars-hbs 固定时):
{{{ads 'page-x' 'vertical' '256x56'}}}

关于javascript - Express-hbs : Asynchronous Helper with options/attrs,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23813003/

10-09 15:44