Express JS:Handlebars "each" 标签不显示内容
Express JS : Handlebars "each" tag not displaying content
我正在使用 Express JS 和 Handlebars 包,实际上我遇到了一些奇怪的事情。我不知道我是否遗漏了什么,我希望如此,但我无法弄清楚我的代码中有什么问题。
我正在使用:https://github.com/ericf/express-handlebars
我无法在我的代码中使用 {{#each}}
语句。
这是我的:
views.ts
const Views = {
config: {
// views template configuration
extname: '.hbs',
helpers: {
modulesList: () => {
return appModules.modulesList();
},
foo: () => { return 'FOO!'; },
bar: ['tic', 'tac', 'toe'],
// bar: () => { return ['tic', 'tac', 'toe'] },
}
},
}
// Views is exported
app.ts
const exphbs = require('express-handlebars');
const views = require('twiice/views.ts');
app.engine('.hbs', exphbs(views.config));
app.set('view engine', '.hbs');
app.set('views', './twiice/views');
home.hbs
<div class="col">
{{#each bar}}
<h6 class="text-light text-uppercase ls-1 mb-1">{{foo}}</h6>
{{/each}}
<h6 class="text-light text-uppercase ls-1 mb-1">Overview</h6>
<h5 class="h3 text-white mb-0">Sales value</h5>
<h6 class="text-light text-uppercase ls-1 mb-1">{{foo}}</h6>
</div>
实际上,foo
显示在h6的最后html代码中,这意味着helper已加载。
但是 each
语句没有显示 bar
的任何内容。
遵循文档:https://handlebarsjs.com/guide/builtin-helpers.html
我看不出有什么问题:/
非常感谢您的帮助,我还在学习中! :)
您没有正确使用 bar
助手。
Handlebars helpers 是函数。当你想在你的模板中使用 helper 时,你可以在 Handlebars 表达式中使用它,比如 {{uppercase firstName}}
。在这个表达式中,uppercase
是我们定义的助手的标识符,firstName
是我们数据上下文对象中的一个变量,它将传递给我们的 uppercase
助手。
表达式 {{#each bar}}
告诉 handlebars 在数据上下文对象中的变量 bar
上调用 built-in #each block helper。
但是,bar
不存在于数据上下文对象中,因为bar
不是我们数据的一部分,而是我们定义的一个不同的助手。所以我们的问题是:我们如何在同一个 Handlebars 表达式中调用两个助手?
Handlebars 有这个问题的答案;它是 Sub-expressions。它所需要的只是将您的内部表达式括在括号中。
这意味着将您的代码更新为 {{#each (bar)}}
就足以告诉 Handlebars bar
是我们想要调用的助手,我们想要传递给它的 return 值#each
.
我创建了一个fiddle供您参考。
我正在使用 Express JS 和 Handlebars 包,实际上我遇到了一些奇怪的事情。我不知道我是否遗漏了什么,我希望如此,但我无法弄清楚我的代码中有什么问题。
我正在使用:https://github.com/ericf/express-handlebars
我无法在我的代码中使用 {{#each}}
语句。
这是我的:
views.ts
const Views = {
config: {
// views template configuration
extname: '.hbs',
helpers: {
modulesList: () => {
return appModules.modulesList();
},
foo: () => { return 'FOO!'; },
bar: ['tic', 'tac', 'toe'],
// bar: () => { return ['tic', 'tac', 'toe'] },
}
},
}
// Views is exported
app.ts
const exphbs = require('express-handlebars');
const views = require('twiice/views.ts');
app.engine('.hbs', exphbs(views.config));
app.set('view engine', '.hbs');
app.set('views', './twiice/views');
home.hbs
<div class="col">
{{#each bar}}
<h6 class="text-light text-uppercase ls-1 mb-1">{{foo}}</h6>
{{/each}}
<h6 class="text-light text-uppercase ls-1 mb-1">Overview</h6>
<h5 class="h3 text-white mb-0">Sales value</h5>
<h6 class="text-light text-uppercase ls-1 mb-1">{{foo}}</h6>
</div>
实际上,foo
显示在h6的最后html代码中,这意味着helper已加载。
但是 each
语句没有显示 bar
的任何内容。
遵循文档:https://handlebarsjs.com/guide/builtin-helpers.html
我看不出有什么问题:/
非常感谢您的帮助,我还在学习中! :)
您没有正确使用 bar
助手。
Handlebars helpers 是函数。当你想在你的模板中使用 helper 时,你可以在 Handlebars 表达式中使用它,比如 {{uppercase firstName}}
。在这个表达式中,uppercase
是我们定义的助手的标识符,firstName
是我们数据上下文对象中的一个变量,它将传递给我们的 uppercase
助手。
表达式 {{#each bar}}
告诉 handlebars 在数据上下文对象中的变量 bar
上调用 built-in #each block helper。
但是,bar
不存在于数据上下文对象中,因为bar
不是我们数据的一部分,而是我们定义的一个不同的助手。所以我们的问题是:我们如何在同一个 Handlebars 表达式中调用两个助手?
Handlebars 有这个问题的答案;它是 Sub-expressions。它所需要的只是将您的内部表达式括在括号中。
这意味着将您的代码更新为 {{#each (bar)}}
就足以告诉 Handlebars bar
是我们想要调用的助手,我们想要传递给它的 return 值#each
.
我创建了一个fiddle供您参考。