2011-08-19 13 views
6

OK. Mój HTML wygląda jak poniżej.Handlebar.js nie odświeżając mojego szablonu

I zapełniam powyższe za pomocą Handlebar.js, a dane są odbierane z serwera. Oto kod.

$.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)); 
}); 

Gdy kod jest uruchamiany po raz pierwszy, wygląda dobrze. Ale kiedy zadzwonię do $ .get po raz drugi (i tak dalej), szablon nie zostanie odświeżony z nowymi danymi.

Wydrukję również cały ciąg danych, aby upewnić się, że dane są odświeżane z serwera i tak jest.

Kiedy sprawdzam w moim Chrome, mówi mi "Uncaught TypeError: Can not call method 'match' of null".

Czy to ma coś wspólnego z "kompilacją"?

Odpowiedz

5

Po raz pierwszy to zrobić:

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

Twój <div> zamienia się w ten sposób:

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

A szablon nie ma. Przenieś swój szablon:

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

na miejsce pod adresem #content-placeholder.

+0

o człowieku. Jestem narzędziem. Dzięki za pomoc. :) – ericbae

+3

Lub możesz przenieść ten blok: 'var source = $ (" # some-template "). Html();' 'var template = Handlebars.compile (źródło);' poza '$. get() 'callback, więc wystarczy pobrać szablon i skompilować go raz, oszczędzając zasoby/prędkość. –

+0

@GarciaWebDev: Tak, to dobra uwaga. Zwykle zakopuję to wszystko w prostym menedżerze szablonów, który zajmuje się kompilowaniem i buforowaniem przy pierwszym użyciu. Jednak nadal uważam, że dobrym pomysłem jest nie mieszanie szablonów i treści. –

Powiązane problemy