如何使车把助手全局化(在 expressjs 中)
How to make a handlebars helper global (in expressjs)
我在 helpers/handlebars.js
中有一个非常简单的把手帮助文件:
var hbs = require('express-handlebars');
hbs.registerHelper("inc", function(value, options) {
return parseInt(value) + 1;
});
但是,正如预期的那样,我无法引用 {{#inc}}
帮助器,因为我没有将它传递给 res.render()
函数。有没有办法让我的文件中的所有助手都全局化,"auto-included"?
编辑:
在尝试@1cgonza 的精彩回答后,我得到:
hbs.registerHelper("inc", function(value, options) {
^
TypeError: undefined is not a function
当 运行 应用程序。这是 app.js
:
var engine = require('express-handlebars');
require('./helpers/handlebars.js')(engine);
app.engine('hbs', engine({defaultLayout: 'layout', extname: 'hbs'}));
app.set('view engine', 'hbs');
有什么想法吗?
您可以尝试将助手导出为模块,然后将它们包含在主模块中 app.js
像这样:
在你的helpers/handlebars.js
function hbsHelpers(hbs) {
hbs.registerHelper("inc", function(value, options) {
return parseInt(value) + 1;
});
// More helpers...
}
module.exports = hbsHelpers;
然后在您的app.js(或您用作索引的文件)中。
var hbs = require('express-handlebars');
require('./helpers/handlebars')(hbs);
这对你有用吗?
编辑
基于 express-handlebars
docs,我会将您的 helpers/handlebars.js
中的函数更改为如下内容:
function hbsHelpers(hbs) {
return hbs.create({
helpers: { // This was missing
inc: function(value, options) {
console.log('reading it');
return parseInt(value) + 1;
}
// More helpers...
}
});
}
module.exports = hbsHelpers;
让我们知道它是否有效。
编辑 2:
糟糕,handelbars.js
文件中的 create()
函数中缺少将您的助手包装在 helpers:{}
中。我已经编辑了我之前的回答,看看我把评论放在哪里就知道我在说什么了。
至于app.js
我觉得有点乱,所以让我重命名一些东西来说明一下:
// I've changed this from engine to exphbs,
// so there is no confusion with the express engine object that we use later.
var exphbs = require('express-handlebars');
// Create an instance of the express-handlebars
// If you want to pass any option offered by express-handlebar module
// do it inside the create() in the handlebars.js file
var handlebars = require('./helpers/handlebars.js')(exphbs);
// The handlebars variable now has an object called engine.
// Use that to define your app.engine
// As said before, you don't need to define any options here.
// Everything is defined in the create() in handlebars.js
app.engine('hbs', handlebars.engine);
// If you are using a different extension, you can change hbs to whatever you are using.
app.set('view engine', 'hbs');
你可以试试:
在helpers/handlebars.js:
var register = function(Handlebars) {
var helpers = {
inc: function(value, options) {
return parseInt(value) + 1;
},
foo: function(var1, var2) {
return ....
}
};
if (Handlebars && typeof Handlebars.registerHelper === "function") {
for (var prop in helpers) {
Handlebars.registerHelper(prop, helpers[prop]);
}
} else {
return helpers;
}
};
module.exports.register = register;
module.exports.helpers = register(null);
在app.js中:
var exphbs = require('express-handlebars');
var hbsHelpers = exphbs.create({
helpers: require("./helpers/handlebars.js").helpers,
defaultLayout: 'layout',
extname: '.hbs'
});
app.engine('.hbs', hbsHelpers.engine);
app.set('view engine', '.hbs');
这是我的解决方案。您可以注册您自己的客户助手和来自 'handlebars-helpers':
的客户助手
const hbshelpers = require('handlebars-helpers');
const multihelpers = hbshelpers();
const helpersDM = {
hlp: echo => `Echo: ${echo}.`,
STATIC: `/static`,
};
const hbs = exphbs.create({
layoutsDir: join(__dirname, 'views', 'layouts'),
partialsDir: join(__dirname, 'views', 'partials'),
extname: '.hbs',
defaultLayout: 'base',
helpers: {...multihelpers, ...helpersDM},
});
app.engine('.hbs', hbs.engine);
app.setViewEngine('.hbs');
您可以使用以下方法注册您自己的助手,
在你的app.js中首先导入express-handlebars,表达npm模块,
const exphbs = require("express-handlebars");
const express = require("express");
const app = express();
现在使用将选项作为对象的创建方法配置 exphbs,
const myhbs = exphbs.create({/*config*/ extname:"hbs", helpers:{equal:function(a,b, options){return (a==b)?options.fn(this):options.inverse(this)}}});
app.engine("hbs", myhbs.engine);
app.set("view engine", "hbs");
通过像这样注册分音器,可以将其作为内置功能在整个车把中使用。
我在 helpers/handlebars.js
中有一个非常简单的把手帮助文件:
var hbs = require('express-handlebars');
hbs.registerHelper("inc", function(value, options) {
return parseInt(value) + 1;
});
但是,正如预期的那样,我无法引用 {{#inc}}
帮助器,因为我没有将它传递给 res.render()
函数。有没有办法让我的文件中的所有助手都全局化,"auto-included"?
编辑:
在尝试@1cgonza 的精彩回答后,我得到:
hbs.registerHelper("inc", function(value, options) {
^
TypeError: undefined is not a function
当 运行 应用程序。这是 app.js
:
var engine = require('express-handlebars');
require('./helpers/handlebars.js')(engine);
app.engine('hbs', engine({defaultLayout: 'layout', extname: 'hbs'}));
app.set('view engine', 'hbs');
有什么想法吗?
您可以尝试将助手导出为模块,然后将它们包含在主模块中 app.js
像这样:
在你的helpers/handlebars.js
function hbsHelpers(hbs) {
hbs.registerHelper("inc", function(value, options) {
return parseInt(value) + 1;
});
// More helpers...
}
module.exports = hbsHelpers;
然后在您的app.js(或您用作索引的文件)中。
var hbs = require('express-handlebars');
require('./helpers/handlebars')(hbs);
这对你有用吗?
编辑
基于 express-handlebars
docs,我会将您的 helpers/handlebars.js
中的函数更改为如下内容:
function hbsHelpers(hbs) {
return hbs.create({
helpers: { // This was missing
inc: function(value, options) {
console.log('reading it');
return parseInt(value) + 1;
}
// More helpers...
}
});
}
module.exports = hbsHelpers;
让我们知道它是否有效。
编辑 2:
糟糕,handelbars.js
文件中的 create()
函数中缺少将您的助手包装在 helpers:{}
中。我已经编辑了我之前的回答,看看我把评论放在哪里就知道我在说什么了。
至于app.js
我觉得有点乱,所以让我重命名一些东西来说明一下:
// I've changed this from engine to exphbs,
// so there is no confusion with the express engine object that we use later.
var exphbs = require('express-handlebars');
// Create an instance of the express-handlebars
// If you want to pass any option offered by express-handlebar module
// do it inside the create() in the handlebars.js file
var handlebars = require('./helpers/handlebars.js')(exphbs);
// The handlebars variable now has an object called engine.
// Use that to define your app.engine
// As said before, you don't need to define any options here.
// Everything is defined in the create() in handlebars.js
app.engine('hbs', handlebars.engine);
// If you are using a different extension, you can change hbs to whatever you are using.
app.set('view engine', 'hbs');
你可以试试:
在helpers/handlebars.js:
var register = function(Handlebars) {
var helpers = {
inc: function(value, options) {
return parseInt(value) + 1;
},
foo: function(var1, var2) {
return ....
}
};
if (Handlebars && typeof Handlebars.registerHelper === "function") {
for (var prop in helpers) {
Handlebars.registerHelper(prop, helpers[prop]);
}
} else {
return helpers;
}
};
module.exports.register = register;
module.exports.helpers = register(null);
在app.js中:
var exphbs = require('express-handlebars');
var hbsHelpers = exphbs.create({
helpers: require("./helpers/handlebars.js").helpers,
defaultLayout: 'layout',
extname: '.hbs'
});
app.engine('.hbs', hbsHelpers.engine);
app.set('view engine', '.hbs');
这是我的解决方案。您可以注册您自己的客户助手和来自 'handlebars-helpers':
的客户助手const hbshelpers = require('handlebars-helpers');
const multihelpers = hbshelpers();
const helpersDM = {
hlp: echo => `Echo: ${echo}.`,
STATIC: `/static`,
};
const hbs = exphbs.create({
layoutsDir: join(__dirname, 'views', 'layouts'),
partialsDir: join(__dirname, 'views', 'partials'),
extname: '.hbs',
defaultLayout: 'base',
helpers: {...multihelpers, ...helpersDM},
});
app.engine('.hbs', hbs.engine);
app.setViewEngine('.hbs');
您可以使用以下方法注册您自己的助手,
在你的app.js中首先导入express-handlebars,表达npm模块,
const exphbs = require("express-handlebars");
const express = require("express");
const app = express();
现在使用将选项作为对象的创建方法配置 exphbs,
const myhbs = exphbs.create({/*config*/ extname:"hbs", helpers:{equal:function(a,b, options){return (a==b)?options.fn(this):options.inverse(this)}}});
app.engine("hbs", myhbs.engine);
app.set("view engine", "hbs");
通过像这样注册分音器,可以将其作为内置功能在整个车把中使用。