2012-04-19 51 views
52

Tôi đang sử dụng mẫu Handlebars và dữ liệu JSON đã được đại diện trong [Object object], làm cách nào để phân tích dữ liệu này bên ngoài Handlebars? Ví dụ, tôi đang cố gắng để tạo một biến JavaScript trên trang thông qua một thẻ handlebars, nhưng điều này không hoạt động.Đối tượng phân tích cú pháp Handlebars.js thay vì [Đối tượng đối tượng]

Mọi đề xuất? Cảm ơn bạn!

EDIT:

Để làm rõ, tôi đang sử dụng ExpressJS w/tay lái cho khuôn mẫu. Trong tuyến đường của tôi, tôi có điều này:

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

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

Sau đó, trong mẫu index.hbs của tôi, bây giờ tôi có đối tượng {{user}}. Tôi có thể sử dụng {{#each}} để lặp qua đối tượng tốt. Tuy nhiên, tôi cũng đang sử dụng Backbonejs và tôi muốn truyền dữ liệu này cho một người, Nhìn ra như thế này:

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

Vấn đề, là {{user}} đơn giản chỉ ra [Object object] trong nguồn nếu tôi đặt nó trong giao diện điều khiển .log Tôi gặp lỗi, 'Số nhận dạng không mong muốn'.

+0

Bạn sẽ phải xây dựng trên Bạn có thể cung cấp [đoạn mã liên quan] (http://sscce.org/) và mô tả về những gì bạn đang mong đợi thay vì '[Object object]'?Nếu bạn chỉ đơn giản là cố gắng để xem các khóa/giá trị của đối tượng, bạn sẽ muốn sử dụng 'console.log' với một trình gỡ lỗi hoặc [' JSON.stringify'] (http://caniuse.com/json). –

+0

Console.log cũng hiển thị [Object object]. Tôi sẽ cập nhật bài viết để giải thích tốt hơn. – dzm

Trả lời

115

Khi xuất {{user}}, trước hết tay lái sẽ lấy .toString() giá trị 's user. Đối với đồng bằng Object s, số default result of this is the "[object Object]" bạn đang xem.

Để có được một cái gì đó hữu ích hơn, bạn sẽ hoặc là muốn hiển thị một tài sản cụ thể của đối tượng:

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

Hoặc, bạn có thể sử dụng/định nghĩa một helper để định dạng các đối tượng khác nhau:

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

phải là: {{{json user}}}, nếu không chuỗi json sẽ được mã hóa. –

+0

Cảm ơn bạn, điều này là hoàn hảo. Đối với người dùng Express: 'app.set ('công cụ xem', 'hbs'); var Handlebars = yêu cầu ('hbs'); ' – Oneiros

+2

Hoạt động tốt. Cũng cho người dùng [express-handlebars] (https://github.com/ericf/express-handlebars): 'var exphbs = require ('express-handlebars'); app.engine ('tay lái', exphbs ({\t \t \t \t \t \t người giúp đỡ: { \t \t \t \t json: function (ngữ cảnh) { \t \t \t \t \t trở JSON.stringify (context); \t \t \t \t} \t \t \t} \t \t))); ' – JayChase

1

Bạn đang cố gắng chuyển cú pháp templating {{ }} bên trong đối tượng JSON không hợp lệ.

Bạn có thể cần phải làm điều này thay vì:

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

3

Tôi đang sử dụng khuôn mẫu phía máy chủ trong nút-js, nhưng điều này cũng có thể áp dụng phía máy khách. Tôi đăng ký Jonathan 's json helper trong nút. Trong trình xử lý của tôi, tôi thêm ngữ cảnh (chẳng hạn như AddressBook) thông qua res.locals. Sau đó, tôi có thể lưu trữ phía máy khách biến ngữ cảnh như sau:

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

Lưu ý ba curlies (như được chỉ ra bởi Jim Liu).

6

Bạn có thể đơn giản stringify JSON:

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

Sau đó, trong mẫu in bằng cách: "không hoạt động"

{{{user.stringify}}}; 
Các vấn đề liên quan