0

我正在尝试在 Handlebars 中使用子表达式,但即使在最简单的表达式上也会出现“options.fn 不是函数”错误。在使用来自https://github.com/assemble/handlebars-helpers的其他助手时,此表达式可以正常工作:

{{#and true true}}OK{{/and}}

但是如果我做一个这样的子表达式

{{#and (gt 4 3) (gt 5 4)}}OK{{/and}}

或这个

{{#and (gt 4 3) true}}OK{{/and}}

库抛出错误

TypeError: [feed.hbs] options.fn is not a function
   at Object.helpers.gt (/Users/me/Projects/jackal/node_modules/handlebars-helpers/lib/comparison.js:152:20)
   在 Object.eval (在 createFunctionContext 进行评估 ...

我需要检查两个条件。这时它用嵌套表达式实现:

{{#gt 4 3}}
    {{#gt 5 4}}
        ok
    {{/gt}}
{{/gt}}

那么我的子表达式有什么问题?

4

1 回答 1

1

在我看来,这种方式 不支持子表达式handlebars-helpers

我用调试器看了一眼代码。对于{{#and (gt 4 3) (gt 5 4)}}OK{{/and}}(gt 4 3)本身被正确调用,但gt助手的代码是:

helpers.gt = function(a, b, options) {
  if (arguments.length === 2) {
    options = b;
    b = options.hash.compare;
  }
  if (a > b) {
    return options.fn(this);
  }
  return options.inverse(this);
};

但是因为子表达式既没有fn(if 块)也没有inverse(else 块),所以此时handlebars-helpers失败。

为了支持您的表达handlebars-helpers需要 - 恕我直言 - 将他们的代码重写为:

helpers.gt = function(a, b, options) {
  if (arguments.length === 2) {
    options = b;
    b = options.hash.compare;
  }

  //fn block exists to it is not a subexpression

  if( options.fn ) {
     if (a > b) {
       return options.fn(this);
     }
     return options.inverse(this);
  } else {
     return a > b;
  }
};

所以现在你不能使用带有handlebars-helpers.

我在他们的 github 页面上添加了一个问题:Supporting Handlebars subexpressions

于 2016-08-21T07:40:25.240 回答