0

我正在使用 Handlebar 并尝试使用 if 条件与 equal like if(value.A==value.B)

下面是我正在尝试的代码。

<div>
    {{#each Data}}
     {{#ifCond value.A value.B}}
               <tr>
            <td>{{value.C}}</td>
            <td>{{value.D}}</td>
            <td>{{value.E}}</td>
            
        </tr>
     {{/ifCond}}
    {{/each}}
</div>

我使用了下面的代码,但它给出了TypeError: hbs.registerHelper is not a function

代码在 app.js 中:-

var expressHbs =  require('express-handlebars');

app.engine('.hbs', expressHbs.engine({ defaultLayout: 'layout', extname: '.hbs'}));
app.set('view engine', '.hbs');

var hbs = expressHbs.create({});
hbs.registerHelper('ifCond', function(v1, v2, options) {
    if(v1 === v2) {
      return options.fn(this);
    }
    return options.inverse(this);
  });
4

1 回答 1

0

这里有几个问题。

首先,正如您的错误所示,registerHelperis不是返回的实例对象上的函数expressHbs.create({})。返回的对象是一个对象的实例,ExpressHandlebars具有registerHelper函数的 Handlebars 库不同。

在 的实例上注册助手的方法ExpressHandlebars是通过传递给的配置对象.create()

var hbs = expressHbs.create({
  helpers: {
    ifCond(v1, v2, options) {
      if (v1 === v2) { return options.fn(this); }
      return options.inverse(this);
    },
  }
});

不幸的是,仅此更改是不够的。这将导致错误:

缺少助手:“ifCond”

这里的问题是我们在实例上创建了ifCond帮助程序hbs,但该hbs实例不是我们设置为 Express View Engine 的实例。

expressHbs.engine我们的 Express View Engine 是使用一些配置属性调用的结果设置的。

Express-Handlebars 让我们可以选择使用.engine函数构造引擎对象或使用.create函数创建实例ExpressHandlebars,每个实例都有自己的.engine对象。

在您的示例中,您没有对hbs实例执行任何操作。您的助手需要添加到expressHbs.engine调用中传递的配置中:

app.engine(
  ".hbs",
  expressHbs.engine({
    defaultLayout: "layout",
    extname: ".hbs",
    helpers: {
      ifCond(v1, v2, options) {
        if (v1 === v2) { return options.fn(this); }
        return options.inverse(this);
      },
    },
  })
);

var hbs = expressHbs.create({});可以删除。

于 2022-02-13T17:05:10.777 回答