2011-08-19 15 views
6

OK. Il mio codice HTML è come sotto.Handlebar.js non aggiorna il mio modello

E sto compilando il suddetto tramite Handlebar.js e i dati sono ricevuti dal server. Ecco il codice.

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

Quando il codice viene eseguito la prima volta, sembra soddisfacente. Ma quando chiamo $ .get la seconda volta (e così via), il modello non viene aggiornato con i nuovi dati.

Inoltre, stampo l'intera stringa di dati, per assicurarmi che i dati vengano aggiornati dal server ed è così.

Quando controllo il mio Chrome, mi dice "Uncaught TypeError: Impossibile chiamare il metodo 'match' di null".

È qualcosa a che fare con "compile"?

risposta

5

La prima volta che si esegue questa operazione:

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

tuo <div> si trasforma in questo:

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

E il modello è andato. Spostare il modello:

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

a qualche parte fuori #content-placeholder.

+0

oh uomo. Sono uno strumento Grazie per l'aiuto. :) – ericbae

+3

Oppure puoi spostare questo blocco: 'var source = $ (" # some-template "). Html();' 'var template = Handlebars.compile (source);' al di fuori di '$. get() 'callback, quindi basta recuperare il template e compilarlo una volta, risparmiando risorse/velocità. –

+0

@GarciaWebDev: Sì, è un buon punto. Di solito seppellisco tutto questo all'interno di un semplice gestore di template che si occupa della compilazione e del caching al primo utilizzo. Tuttavia, ritengo comunque che sia una buona idea non mescolare i modelli e il contenuto. –

Problemi correlati