2012-04-19 12 views
52

Używam szablonów Handlebars, a dane JSON są już reprezentowane w [Object object], jak mam analizować te dane poza Handlebars? Na przykład próbuję wstawić zmienną JavaScript na stronie za pomocą tagu kierownicy, ale to nie działa.Handlebars.js parsować obiekt zamiast [Obiekt obiektu]

Wszelkie sugestie? Dziękuję Ci!

EDIT:

celu wyjaśnienia, używam ExpressJS w/Kierownice do szablonów. W mojej trasie, mam to:

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

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

Wtedy w moim szablonu index.hbs, mam teraz {{user}} obiekt. Mogę użyć {{#each}} do iteracji po obiekcie. Jednak Używam również backbone.js i chcę przekazać te dane do widoku, takie jak ten:

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

Problemem jest to, że po prostu pokazuje [Object object]{{user}} w źródle, jeśli umieścić go w konsoli .log Wystąpił błąd "Nieoczekiwany identyfikator".

+0

Musisz rozwinąć Czy możesz podać [odpowiedni fragment kodu] (http://sscce.org/) i opis tego, czego się spodziewasz zamiast "[obiektu obiektu]"?Jeśli po prostu próbujesz zobaczyć klucze/wartości obiektu, będziesz chciał użyć 'console.log' z debuggerem lub [' JSON.stringify'] (http://caniuse.com/json). –

+0

Console.log pokazuje również [Obiekt obiektu]. Zaktualizuję post, aby lepiej wyjaśnić. – dzm

Odpowiedz

115

Podczas wyprowadzania {{user}}, Kierownice najpierw pobrać user „s .toString() wartość. Dla zwykłych Object s, default result of this is the "[object Object]" widać.

dostać coś bardziej użytecznego, to albo chcesz wyświetlić konkretną właściwość obiektu:

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

Albo można użyć/określić pomocnika formatować obiektu inaczej:

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

powinno to być: {{{json user}}}, w przeciwnym razie ciąg json będzie zakodowany. –

+0

Dziękuję, to jest idealne. Dla użytkowników Express: 'app.set ('widok silnika', 'hbs'); var Kierownice = wymagaj ('hbs'); ' – Oneiros

+2

Działa świetnie. Także dla użytkowników [express-handlebars] (https://github.com/ericf/express-handlebars): 'var exphbs = require ('express-handlebars'); app.engine kierownicy ('', exphbs ({\t \t \t \t \t \t pomocników: { \t \t \t \t json: funkcję (kontekst) { \t \t \t \t \t powrotu JSON.stringify (kontekstu); \t \t \t \t} \t \t \t} \t \t})); ' – JayChase

1

Próbujesz przekazać templating składni {{ }} wewnątrz obiektu JSON, który nie jest ważny.

Być może trzeba to zrobić w zamian:

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

3

Używam stronie serwera templating w węźle-js, ale może to mieć zastosowanie po stronie klienta, jak również. Zarejestrowałem pomocnika json Jonathan w węźle. W moim module obsługi dodaję kontekst (taki jak notes adresowy) za pomocą polecenia res.locals. Następnie można przechowywać kontekstowe zmienną po stronie klienta w następujący sposób:

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

zanotować potrójne nawiasów klamrowych (jak podkreślił Jim Liu).

6

Można prosty stringify JSON:

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

Następnie w szablonie wydruku przez:. "Nie działa"

{{{user.stringify}}}; 
Powiązane problemy