2011-08-19 12 views
6

OK。私の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を2回目などと呼び出すと、テンプレートは新しいデータでリフレッシュされません。

また、データ・ストリング全体を印刷して、サーバーからデータがリフレッシュされていることを確認します。

Chromeをチェックすると、「Uncaught TypeError:nullのメソッド 'match'を呼び出すことができません」というメッセージが表示されます。

"コンパイル"と関係がありますか?

答えて

5

あなたがこれを行う最初の時間:

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

あなた<div>この変身:

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

そして、あなたのテンプレートがなくなっています。 #content-placeholder外のどこかに

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

:あなたのテンプレートを移動します。

+0

oh man。私は道具です。ご協力いただきありがとうございます。 :) – ericbae

+3

または、このブロックを移動することもできます。 'var source = $("#some-template ").html();' 'varテンプレート= Handlebars.compile(ソース);'。 get() 'コールバックなので、テンプレートを取り出して一度コンパイルするだけで、リソース/スピードを節約できます。 –

+0

@ GarciaWebDev:うん、それは良い点です。私は通常、最初の使用時にコンパイルとキャッシングを扱う単純なテンプレートマネージャの中にすべてを埋め込みます。しかし、私はまだテンプレートとコンテンツを混ぜないことをお勧めします。 –