2011-08-19 1 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 두 번째 시간 (등)을 호출하면 템플릿이 새 데이터로 새로 고쳐지지 않습니다.

또한 전체 데이터 문자열을 인쇄하여 데이터가 서버에서 새로 고쳐지고 있는지 확인합니다.

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 template = Handlebars.compile (source);'. get()'콜백을 사용하면 템플릿을 가져 와서 한 번 컴파일하여 리소스/속도를 절약 할 수 있습니다. –

+0

@ GarciaWebDev : 예, 좋은 지적입니다. 평소에 컴파일 및 캐싱을 다루는 간단한 템플릿 관리자에이 모든 것을 묻습니다. 그러나 나는 여전히 템플릿과 내용을 혼합하지 않는 것이 좋습니다. –