Error: Missing Helper in Handlebars.js
Error: Missing Helper in Handlebars.js
我正在使用 handlebars.js 带有节点和表达的模板。我正在使用 {{@index}}
模板标签制作一个编号列表,但是由于索引从 0 开始,而我想从 1 开始,看来我需要使用自定义助手。我看过很多关于此的帖子,并且找到了以下代码:
Handlebars.registerHelper("inc", function(value, options)
{
return parseInt(value) + 1;
});
{{#each score}}
<li class="list-group-item">
<div id="place"> {{inc @index}}   </div>
<div class="wordOrName">{{ player_name }}</div>
<div class="number">{{ score }}</div></li>
{{/each}}
我似乎找不到辅助寄存器函数应该去哪里。我试过将它放在模板本身和其他各个地方,但我仍然不断收到
Error: Missing helper: "inc"
at model.<anonymous>
理想情况下,我希望将助手放在单独的文件中 helpers.js 但我对如何让车把识别它一无所知。
编辑:
Handlebars 包含在项目中,节点文件中包含以下代码index.js:
// view engine
app.set('views', __dirname + '/views/');
app.set('view engine', 'handlebars');
app.engine('handlebars', engines.handlebars);
在模板本身中包含辅助函数似乎是不可能的。
您可以将助手粘贴到一个单独的文件中,就像您所说的那样 "helper.js" 并在导入 Handlebars JS 文件后将其包含在您的 HTML 页面中。
<script src="handlebars.min.js"></script>
<script src="helper.js"></script>
您还可以查看 Swag (https://github.com/elving/swag),它包含很多有用的车把助手。
我想通了...助手确实需要像这样在节点应用程序文件中注册:
// view engine
app.set('views', __dirname + '/views/');
app.set('view engine', 'handlebars');
var hbs = require('handlebars');
hbs.registerHelper("inc", function(value, options)
{
return parseInt(value) + 1;
});
app.engine('handlebars', engines.handlebars);
我希望此信息更容易访问,但就是这样。
您不需要添加 require('handlebars')
来让助手工作。您可以坚持使用快速车把。像这样在配置对象中定义助手 var myConfig = { helpers: {x: function() {return "x";}} }
并将其传递给 express-handlebars-object 像这样:require('express-handlebars').create({myConfig})
这是一个功能齐全的示例,其中配置了一些助手和一些视图目录。
var express = require('express');
var exphbs = require('express-handlebars');
var app = express();
var hbs = exphbs.create({
helpers: {
test: function () { return "Lorem ipsum" },
json: function (value, options) {
return JSON.stringify(value);
}
},
defaultLayout: 'main',
partialsDir: ['views/partials/']
});
app.engine('handlebars', hbs.engine);
app.set('view engine', 'handlebars');
app.set('views', path.join(__dirname, 'views'));
我的理解是 require('express-handlebars');
返回的对象不是 "real" handlebars 对象。所以你不能依赖某些函数,而是必须通过配置对象将助手之类的东西传递给 .create()
函数
我的一个朋友也提出了这个建议,而且奏效了!
<h2>Success!</h2>
{{#each data}}
<div>
Name: {{ LocalizedName }}<br>
Rank: {{ Rank }}<br>
</div>
{{/each}}
注册数学车把并执行所有数学运算。
app.engine('handlebars', exphbs({
helpers:{
// Function to do basic mathematical operation in handlebar
math: function(lvalue, operator, rvalue) {
lvalue = parseFloat(lvalue);
rvalue = parseFloat(rvalue);
return {
"+": lvalue + rvalue,
"-": lvalue - rvalue,
"*": lvalue * rvalue,
"/": lvalue / rvalue,
"%": lvalue % rvalue
}[operator];
}
}}));
app.set('view engine', 'handlebars');
然后就可以直接在你的视图中进行操作了
{{#each myArray}}
<span>{{math @index "+" 1}}</span>
{{/each}}
我们可以通过 css counter
属性:
解决这个问题
body {
/* Set "my-sec-counter" to 0 */
counter-reset: my-sec-counter;
}
h2::before {
/* Increment "my-sec-counter" by 1 */
counter-increment: my-sec-counter;
content: counter(my-sec-counter) ". ";
}
<h2>HTML Tutorial</h2>
<h2>CSS Tutorial</h2>
<h2>JavaScript Tutorial</h2>
<h2>Bootstrap Tutorial</h2>
<h2>SQL Tutorial</h2>
<h2>PHP Tutorial</h2>
我正在使用 handlebars.js 带有节点和表达的模板。我正在使用 {{@index}}
模板标签制作一个编号列表,但是由于索引从 0 开始,而我想从 1 开始,看来我需要使用自定义助手。我看过很多关于此的帖子,并且找到了以下代码:
Handlebars.registerHelper("inc", function(value, options)
{
return parseInt(value) + 1;
});
{{#each score}}
<li class="list-group-item">
<div id="place"> {{inc @index}}   </div>
<div class="wordOrName">{{ player_name }}</div>
<div class="number">{{ score }}</div></li>
{{/each}}
我似乎找不到辅助寄存器函数应该去哪里。我试过将它放在模板本身和其他各个地方,但我仍然不断收到
Error: Missing helper: "inc"
at model.<anonymous>
理想情况下,我希望将助手放在单独的文件中 helpers.js 但我对如何让车把识别它一无所知。
编辑:
Handlebars 包含在项目中,节点文件中包含以下代码index.js:
// view engine
app.set('views', __dirname + '/views/');
app.set('view engine', 'handlebars');
app.engine('handlebars', engines.handlebars);
在模板本身中包含辅助函数似乎是不可能的。
您可以将助手粘贴到一个单独的文件中,就像您所说的那样 "helper.js" 并在导入 Handlebars JS 文件后将其包含在您的 HTML 页面中。
<script src="handlebars.min.js"></script>
<script src="helper.js"></script>
您还可以查看 Swag (https://github.com/elving/swag),它包含很多有用的车把助手。
我想通了...助手确实需要像这样在节点应用程序文件中注册:
// view engine
app.set('views', __dirname + '/views/');
app.set('view engine', 'handlebars');
var hbs = require('handlebars');
hbs.registerHelper("inc", function(value, options)
{
return parseInt(value) + 1;
});
app.engine('handlebars', engines.handlebars);
我希望此信息更容易访问,但就是这样。
您不需要添加 require('handlebars')
来让助手工作。您可以坚持使用快速车把。像这样在配置对象中定义助手 var myConfig = { helpers: {x: function() {return "x";}} }
并将其传递给 express-handlebars-object 像这样:require('express-handlebars').create({myConfig})
这是一个功能齐全的示例,其中配置了一些助手和一些视图目录。
var express = require('express');
var exphbs = require('express-handlebars');
var app = express();
var hbs = exphbs.create({
helpers: {
test: function () { return "Lorem ipsum" },
json: function (value, options) {
return JSON.stringify(value);
}
},
defaultLayout: 'main',
partialsDir: ['views/partials/']
});
app.engine('handlebars', hbs.engine);
app.set('view engine', 'handlebars');
app.set('views', path.join(__dirname, 'views'));
我的理解是 require('express-handlebars');
返回的对象不是 "real" handlebars 对象。所以你不能依赖某些函数,而是必须通过配置对象将助手之类的东西传递给 .create()
函数
我的一个朋友也提出了这个建议,而且奏效了!
<h2>Success!</h2>
{{#each data}}
<div>
Name: {{ LocalizedName }}<br>
Rank: {{ Rank }}<br>
</div>
{{/each}}
注册数学车把并执行所有数学运算。
app.engine('handlebars', exphbs({
helpers:{
// Function to do basic mathematical operation in handlebar
math: function(lvalue, operator, rvalue) {
lvalue = parseFloat(lvalue);
rvalue = parseFloat(rvalue);
return {
"+": lvalue + rvalue,
"-": lvalue - rvalue,
"*": lvalue * rvalue,
"/": lvalue / rvalue,
"%": lvalue % rvalue
}[operator];
}
}}));
app.set('view engine', 'handlebars');
然后就可以直接在你的视图中进行操作了
{{#each myArray}}
<span>{{math @index "+" 1}}</span>
{{/each}}
我们可以通过 css counter
属性:
body {
/* Set "my-sec-counter" to 0 */
counter-reset: my-sec-counter;
}
h2::before {
/* Increment "my-sec-counter" by 1 */
counter-increment: my-sec-counter;
content: counter(my-sec-counter) ". ";
}
<h2>HTML Tutorial</h2>
<h2>CSS Tutorial</h2>
<h2>JavaScript Tutorial</h2>
<h2>Bootstrap Tutorial</h2>
<h2>SQL Tutorial</h2>
<h2>PHP Tutorial</h2>