2012-09-19 136 views
4

我爲html模板使用(或至少開始)HandlebarsJS但我可能已經死了。我想要的是將一個功能傳遞給模板,例如將功能傳遞到Handlebars模板

<div id="divTemplate"> 
    <span onclick="{{func}}">{{text}}</span> 
</div> 

,然後我會希望有一些像

var source = $('#divTemplate').html(); 
var template = Handlebars.compile(source); 

var data = { 
    "text": "Click here", 
    "func": function(){ 
    alert("Clicked"); 
    } 
}; 

$('body').append(template(data)); 

但在初始化函數執行,它不傳遞到模板,其結果是:

<span onclick="">Click here</span>. 

我正在嘗試一些輔助函數的東西,但我也無法使它工作。任何想法,將不勝感激。 :)

回答

13

該解決方案非常簡單。

把手將輸出要傳遞到模板對象的屬性,如果該屬性是一個功能它將執行的功能和輸出返回值

在你的例子函數不會返回任何值(它只是調用alert),所以輸出是空的。

您可以創建一個helper方法是這樣的:

handlebars.registerHelper('stringifyFunc', function(fn) { 
    return new Handlebars.SafeString("(" + 
       fn.toString().replace(/\"/g,"'") + ")()"); 
}); 

然後在模板中,你只需要使用它需要被字符串化的功能:

<div id="divTemplate"> 
    <span onclick="{{stringifyFunc func}}">{{text}}</span> 
</div> 
+0

我不斷收到「意外的令牌(「與我的例子中的'data'變量(包含函數),我應該改變它別的嗎? – isHristov

+0

忘記把它包裝在一個閉包中,你還需要做一些轉義,這裏是一個工作小提琴:http://jsfiddle.net/fHycd/ – BFil

+0

謝謝朋友,喲你非常有幫助! :) – isHristov