2011-08-19 35 views
6

確定。我的HTML如下所示。Handlebar.js不刷新我的模板

<div id="json"></div> 

<div id="content-placeholder"> 
    <script id="some-template" type="text/x-handlebars-template"> 
    <table> 
     <thead> 
     <th>col 1</th> 
     <th>col 2</th> 
     </thead> 
     <tbody> 
     {{#results}} 
     <tr> 
      <td>{{col_1}}</td> 
      <td>{{col_2}}</td> 
     </tr> 
     {{/results}} 
     </tbody> 
    </table> 
    </script>      
</div> 

而且我填充上述通過Handlebar.js和數據從服務器接收。這是代碼。

$.get(get_data_url, function(data) 
{ 
    $('#json').empty().append(data); 
    var rows = eval('(' + data + ')'); 

    var source = $("#some-template").html(); 
    var template = Handlebars.compile(source);         
    $("#content-placeholder").empty().append(template(rows)); 
}); 

當代碼第一次運行時,它看起來很好。但是當我第二次調用$ .get(等等)時,模板不會被新數據刷新。

我還打印出整個數據串,以確保數據從服務器刷新,它是。

當我檢查我的瀏覽器,它告訴我「遺漏的類型錯誤:無法調用空的‘比賽’。」

是否是與「編譯」?

回答

5

第一次這樣做:

$("#content-placeholder").empty()... 

<div>變成這樣:

<div id="content-placeholder"> 
</div> 

而且你的模板了。將您的模板:

<script id="some-template" type="text/x-handlebars-template"> 
    ... 
</script> 

某處外#content-placeholder

+0

哦。我是一個工具。謝謝你的幫助。 :) – ericbae

+3

或者您可以移動此塊: 'var source = $(「#some-template」)。html();' 'var template = Handlebars.compile(source);' ''之外。 get()'回調,所以你只需要獲取模板並編譯一次,節省資源/速度。 –

+0

@GarciaWebDev:是的,這是一個很好的觀點。我通常將所有這些內容都埋在一個簡單的模板管理器中,用於首次使用時編譯和緩存。不過,我仍然認爲不要混合模板和內容是一個好主意。 –