2012-04-19 14 views
52

Uso i modelli Handlebars e i dati JSON sono già rappresentati in [Oggetto oggetto], come posso analizzare questi dati al di fuori del Handlebars? Ad esempio, sto cercando di popolare una variabile JavaScript nella pagina tramite un tag manubrio, ma questo non funziona.Handlebars.js analizza oggetto invece di [Oggetto oggetto]

Qualche suggerimento? Grazie!

EDIT:

Per chiarire, sto usando ExpressJS w/manubrio per template. Nel mio percorso, ho questo:

var user = {} 
user = {'id' : 123, 'name' : 'First Name'} 

res.render('index', {user : user}); 

Poi nel mio modello index.hbs, ora ho un oggetto {{user}}. Posso usare {{#each}} per scorrere l'oggetto perfettamente. Tuttavia, sto utilizzando anche Backbonejs e voglio passare questi dati per una visualizzazione, come ad esempio questo:

myView = new myView({user : {{user}});

Il problema, è che {{user}} mostra semplicemente [Object object] nella fonte, se lo metto in consolle .log Ricevo un errore, 'Identificatore imprevisto'.

+0

dovrete elaborare su Potete fornire [uno snippet di codice pertinente] (http://sscce.org/) e una descrizione di cosa vi aspettate invece di '[Object object]'?Se stai semplicemente cercando di vedere le chiavi/i valori dell'oggetto, ti consigliamo di utilizzare 'console.log' con un debugger o [' JSON.stringify'] (http://caniuse.com/json). –

+0

Anche Console.log mostra [Oggetto oggetto]. Aggiornerò i post per spiegare meglio – dzm

risposta

115

Quando si emette {{user}}, Manubrio sarà prima recuperare .toString() valore s' il user. Per semplici Object s, lo default result of this is the "[object Object]" che stai vedendo.

Per ottenere qualcosa di più utile, potrete sia desidera visualizzare una proprietà specifica dell'oggetto:

{{user.id}} 
{{user.name}} 

In alternativa, è possibile utilizzare/definire un aiutante per formattare l'oggetto in modo diverso:

Handlebars.registerHelper('json', function(context) { 
    return JSON.stringify(context); 
}); 
myView = new myView({ 
    user : {{{json user}}} // note triple brackets to disable HTML encoding 
}); 
+12

dovrebbe essere: {{{json user}}}, altrimenti la stringa json sarà codificata. –

+0

Grazie, questo è perfetto. Per utenti Express: 'app.set ('view engine', 'hbs'); var Handlebar = require ('hbs'); ' – Oneiros

+2

Funziona alla grande. Anche per gli utenti di [express-manubri] (https://github.com/ericf/express-handlebars): 'var exphbs = require ('express-handlebar'); app.engine ('manubri', exphbs ({\t \t \t \t \t \t aiutanti: { \t \t \t \t JSON: function() {contesto \t \t \t \t \t ritorno JSON.stringify (contesto); \t \t \t \t} \t \t \t} \t \t})); ' – JayChase

1

Si sta tentando di passare la sintassi dei modelli {{ }} all'interno di un oggetto JSON che non è valido.

Potrebbe essere necessario fare questo, invece:

myView = new myView({ user : user });

3

sto utilizzando template lato server nel nodo-js, ma questo può applicare sul lato client pure. Registro il json helper di Jonathan nel nodo. Nel mio gestore, aggiungo contesto (come addressBook) tramite res.locals. Poi posso archiviare contesto variabile sul lato client come segue:

<script> 
    {{#if addressBook}} 
    console.log("addressBook:", {{{json addressBook}}}); 
    window.addressBook = {{{json addressBook}}}; 
    {{/if}} 
</script> 

Nota le graffe triple (come sottolineato da Jim Liu).

6

È possibile semplice stringa i il JSON:

var user = {} 
user = {'id' : 123, 'name' : 'First Name'}; 
// for print 
user.stringify = JSON.stringify(user); 

Poi in stampa template: "non funziona"

{{{user.stringify}}}; 
Problemi correlati