Express-hbs: 带有选项和属性的异步辅助函数

4
我正在使用express-hbs和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' }}

有人能帮我解决这个问题吗? 谢谢!


我认为正确的手柄HTML是{{{ads page-x vertical 256x56}}}。您不需要引号或逗号。 - Lucas T.
1个回答

0

简而言之,目前(v0.7.10)在 express-hbs 中你只能提供一个参数。

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

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中多个参数问题的原因如下:

简而言之,express-hbs registerAsyncHelper代码如下:

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

在handlebars.registerHelper中只注册了一个参数(context),但是handlebars会将每个提供的参数作为额外参数调用已注册的helper。因此,注册的函数应该像这样:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接