2013-03-24 36 views
2

我正在寻找一种方法来创建一个帮助器,它只是简单地呈现放置模板的文件的基本名称,并且不需要任何其他参数,像这样:{{ basename }}。换句话说,如果我在两个部分中使用这个助手,比如说header.hbsnavbar.hbs,我希望每个部分的名称在输出中的任何地方被渲染。Handlebars帮助器检索使用它的文件的基名称

我查找了几个小时,找不到任何答案。任何方向或指导,将不胜感激。

+0

我怀疑当你的帮手运行时,把手甚至会知道文件名(如果有甚至要知道文件名)。你可能需要破解核心的Handlebars代码,并说黑客可能比你想要的大。 – 2013-03-24 17:16:27

+0

这就是我在摆弄了一段时间后怀疑的事情,但我希望有一些我不知道的隐藏的超级特征......对此:“如果甚至有文件名要知道”,我试图想一种“制造”的方式,这种方法已知为具有节点路径/ fs的句柄。似乎不可能 – jonschlinkert 2013-03-24 17:24:57

+1

问题(可能)是两种将Handlebars放入东西的方法是'Handlebars.compile'和'Handlebars.registerPartial',这两种方法都不了解文件,他们只知道字符串。我不能保证没有神奇的捷径,但似乎不太可能。 – 2013-03-24 18:05:13

回答

1

不知道太多关于你的设置在这里是一种方法。

您需要在渲染功能中注册助手。然后你将调用渲染而不是编译。请注意以下是后端,但您可以轻松地将其适用于您的环境。

把手没有你的环境概念,所以你需要在全球某个地方设置它。

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); 
}; 
+0

@Hatchare我认为jonschlinkert指的是使用节点path.basename('header.hbs')来获取诸如'header'之类的东西在他的文件中使用。我是否正确地认为你正在考虑像url主机名或其他文件的基本路径? 我认为你的渲染函数可能会有用,只是返回传递的名称(应该是部分名称,对吧?)。 – doowb 2013-03-28 00:37:01

+1

所以他可以像'var host = name;'那样做一些事情来传递变量,当然要去掉.hbs,并将主机变量改为更有意义的东西。 – Hatchware 2013-03-28 15:37:23

0

这是渲染文件时需要暴露在上下文中的东西。

例如,假设我们在文件路径“一些/ 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" 
相关问题