2012-07-23 68 views
9

嘿傢伙!在手柄中的助手內呈現模板

因爲這似乎沒有答案:Passing variables through handlebars partial但是,我目前正在研究一個小的解決方法來完成這項工作。所以,這個想法是註冊一個輔助函數,它可以呈現一個具有可能值的特定模板。一段代碼使它更好理解。

這是我怎麼會調用我的幫助:

<div> 
    {{myHelper}} 
</div> 

該輔助用這個小小的代碼註冊:

hbs.registerHelper(name, function (args) { 
    args = args || {}; 
    var template = hbs.compile(fs.readFileSync(__dirname + '/' + file, 'utf8')); 
    return template(args); 
}); 

我把這個snippiet成一個圈登記在不同的助手一旦。這意味着給出'名字'和'文件'。

好了,現在我能夠做這樣的事:

// 'values' could be something like this: 

var values = { headline: 'HEADLINE' } 

<div> 
    {{myHelper values}} 
</div> 

在一個幫助我現在就可以測試是否被賦予了特定的值:

// myHelper template 

<div> 
    {{#if headline}} 
    <h1>{{headline}}</h1> 
    {{/if}} 
    <p>Lorem ipsum</p> 
</div> 

這一點的解決方法對我的作品,但有一個問題。如上所述註冊助手,返回一個簡單的HTML轉義字符串。因此,調用助手不會輸出呈現的HTML片段。它將HTML輸出爲一個轉義字符串。

有沒有人有一個想法,我可以如何讓我的代碼片段返回HTML爲HTML?

/帕斯卡爾

回答

20

Handlebars doc

把手不會逃脫Handlebars.SafeString。如果你編寫一個幫助程序來生成自己的HTML,你通常會想要返回一個新的Handlebars.SafeString(結果) 。在這種情況下,您將需要手動轉義參數。

嘗試

hbs.registerHelper(name, function (args) { 
    args = args || {}; 
    var template = hbs.compile(fs.readFileSync(__dirname + '/' + file, 'utf8')); 

    // return new hbs.SafeString(template(args)); 
    // From @Maroshii 
    // the SafeString method must be accessed through hbs.handlebars 
    // and not directly through hbs 
    // https://github.com/donpark/hbs#handlebars 

    return new hbs.handlebars.SafeString(template(args)); 
}); 
+0

是啊!這對我行得通!非常感謝! – PascalPrecht 2012-07-23 13:46:31

+10

如果有效,請相應地標記答案 – brafales 2012-11-11 14:38:24

+0

以防萬一有人遇到此問題......必須通過'hbs.handlebars'訪問'SafeString'方法,而不是直接通過'hbs'訪問......這是針對節點的。 js用戶:) – Maroshii 2013-06-19 09:42:14

24

我只是想指出的是,使用三層支架無需運行任何其他方法轉換爲HTML。例如,當訪問模板數據時,只需使用三重花括號{{{templateData}}},它允許您獲取原始HTML。

+0

這幫助我找到我的答案! TY – Fasani 2013-08-14 12:13:06