我正在尋找一種方法來創建一個幫助器,它只是簡單地呈現放置模板的文件的基本名稱,並且不需要任何其他參數,像這樣:{{ 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