我正在寻找一种方法来创建一个帮助器,它只是简单地呈现放置模板的文件的基本名称,并且不需要任何其他参数,像这样:{{ basename }}
。换句话说,如果我在两个部分中使用这个助手,比如说header.hbs
和navbar.hbs
,我希望每个部分的名称在输出中的任何地方被渲染。Handlebars帮助器检索使用它的文件的基名称
我查找了几个小时,找不到任何答案。任何方向或指导,将不胜感激。
我正在寻找一种方法来创建一个帮助器,它只是简单地呈现放置模板的文件的基本名称,并且不需要任何其他参数,像这样:{{ basename }}
。换句话说,如果我在两个部分中使用这个助手,比如说header.hbs
和navbar.hbs
,我希望每个部分的名称在输出中的任何地方被渲染。Handlebars帮助器检索使用它的文件的基名称
我查找了几个小时,找不到任何答案。任何方向或指导,将不胜感激。
不知道太多关于你的设置在这里是一种方法。
您需要在渲染功能中注册助手。然后你将调用渲染而不是编译。请注意以下是后端,但您可以轻松地将其适用于您的环境。
把手没有你的环境概念,所以你需要在全球某个地方设置它。
exports.render = function (name, req, context) {
if (isBrowser()) {
throw new Error('Render cannot be called client-side.');
}
handlebars.registerHelper('basename', function() {
var host = globalBasenameSetFromEnvironment;
return host;
});
if (!handlebars.templates[name]) {
throw new Error('Template Not Found: ' + name);
}
return handlebars.templates[name](context);
};
这是渲染文件时需要暴露在上下文中的东西。
例如,假设我们在文件路径“一些/ template.hbs”,里面有像在
Basename is: "{{basename}}"
下面的模板,我们可以使它像这样:
var fs = require('fs');
var hbs = require('handlebars');
var filepath = 'some/template.hbs';
var tmpl = fs.readFileSync(filepath, 'utf8');
var fn = hbs.compile(tmpl);
var str = fn({
path: filepath,
basename: path.basename(filepath)
});
console.log(str);
// Basename is: "template.hbs"
我怀疑当你的帮手运行时,把手甚至会知道文件名(如果有甚至要知道文件名)。你可能需要破解核心的Handlebars代码,并说黑客可能比你想要的大。 – 2013-03-24 17:16:27
这就是我在摆弄了一段时间后怀疑的事情,但我希望有一些我不知道的隐藏的超级特征......对此:“如果甚至有文件名要知道”,我试图想一种“制造”的方式,这种方法已知为具有节点路径/ fs的句柄。似乎不可能 – jonschlinkert 2013-03-24 17:24:57
问题(可能)是两种将Handlebars放入东西的方法是'Handlebars.compile'和'Handlebars.registerPartial',这两种方法都不了解文件,他们只知道字符串。我不能保证没有神奇的捷径,但似乎不太可能。 – 2013-03-24 18:05:13