2013-03-24 61 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" 
相關問題