Handlebars.js解析对象而不是[Object object]

时间:2012-04-19 16:29:51

标签: javascript json handlebars.js

我使用Handlebars模板并且JSON数据已在[Object object]中表示,如何在Handlebars之外解析这些数据?例如,我尝试通过手柄标记在页面上填充JavaScript变量,但这不起作用。

有什么建议吗?谢谢!

编辑:

为了澄清,我使用ExpressJS w / Handlebars进行模板化。在我的路线中,我有这个:

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

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

然后在我的index.hbs模板中,我现在有一个{{user}}对象。我可以使用{{#each}}来仔细迭代对象。但是,我也使用Backbonejs,我想将这些数据传递给View,例如:

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

问题是{{user}}只是在源代码中显示[Object object],如果我将它放在console.log中我会收到错误,'意外的标识符'。

6 个答案:

答案 0 :(得分:138)

输出{{user}}时,Handlebars将首先检索user的{​​{1}}值。对于普通.toString() s,您看到的是default result of this is the "[object Object]"

为了获得更有用的东西,你要么想要显示对象的特定属性:

Object

或者,您可以使用/定义帮助程序以不同方式格式化对象:

{{user.id}}
{{user.name}}
Handlebars.registerHelper('json', function(context) {
    return JSON.stringify(context);
});

答案 1 :(得分:10)

您可以简单地 stringify JSON:

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

然后在模板打印中:

{{{user.stringify}}};

答案 2 :(得分:4)

我在node-js中使用服务器端模板,但这也可能适用于客户端。我在节点中注册了Jonathan的json助手。在我的处理程序中,我通过res.locals添加上下文(例如addressBook)。然后我可以按如下方式存储上下文变量client side:

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

注意三重曲线(由Jim Liu指出)。

答案 3 :(得分:1)

您正试图在无效的JSON对象中传递模板语法{{ }}

您可能需要这样做:

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

答案 4 :(得分:0)

如果要对输出格式进行更多控制,可以编写自己的帮助器。这具有递归功能,可遍历嵌套对象。

  Handlebars.registerHelper('objToList', function(context) {
    function toList(obj, indent) {
      var res=""
      for (var k in obj) { 
          if (obj[k] instanceof Object) {
              res=res+k+"\n"+toList(obj[k], ("   " + indent)) ;
          }
          else{
              res=res+indent+k+" : "+obj[k]+"\n";
          }
      }
      return res;
    }    
    return toList(context,"");
  });

我们使用了用于电子邮件模板的把手,这对像以下用户一样有用

{
  "user": {
    "id": 123,
    "name": "First Name",
    "account": {
      "bank": "Wells Fargo",
      "sort code": " 123-456"
    }
  }
}

答案 5 :(得分:0)

在节点路由器中 - 将响应对象字符串化。见下一行。

 response.render("view", {responseObject:JSON.stringify(object)});

在 HTML Script 标签中 - 用户模板文字(模板字符串)并使用 JSON.parse。

const json= `{{{responseObject}}}`;
const str = JSON.parse(json);

像魅力一样工作!