【问题标题】:JSON / Jade - Cannot output JSON variable to Jade templateJSON / Jade - 无法将 JSON 变量输出到 Jade 模板
【发布时间】:2013-04-11 18:57:58
【问题描述】:

我将一些 JSON 数据传递给 Jade 模板,但似乎无法将 JSON 数据打印到我的 Jade 模板。这是存储并传递给 Jade 模板的 JSON 示例:

{ name: 'Team 1',
  _id: 5134d71192cf972226000003,
  __v: 0,
  key: 1362417425623 }

像这样传递给 Jade 模板:

res.render('tournamentDetails', { 'tournamentData' : tournamentData, seedsSerialized : JSON.stringify(tournamentData.teams) } );

Jade 模板的格式为:

script(type='text/javascript')
                var seeds = [#{tournamentData.teams}];

我正在尝试在单独的 JavaScript 文件中访问此变量 seeds,但似乎无法访问它们。我一直在使用alert 进行测试,以测试 JavaScript 文件中种子中的内容,而不是团队。

这也是从 Jade 生成的 HTML:

var seeds = [{ name: 'Team 1',
  _id: 5134d71192cf972226000003,
  __v: 0,
  key: 1362417425623 },{ name: 'Team 2',
  _id: 5139dc66b48da58d0e000001,
  __v: 0,
  key: 1362746470498 },{ name: 'Team 3',
  _id: 5139dda45f1598440f000001,
  __v: 0,
  key: 1362746788314 },{ name: 'Team 4',
  _id: 513b2c66cfd50dce11000001,
  __v: 0,
  key: 1362832486554 }];

如何访问 JavaScript 文件中的团队?我想将teamsnames 输出到Jade 模板。

【问题讨论】:

  • 我真的很想帮忙,但只是再澄清一点。问题是 seeds 在 Jade 的输出中没有正确生成,还是您无法从其他地方访问 seeds?如果输出错误,你能举一个预期输出的例子吗?还有,你为什么要创建seedsSerialized,却不使用它来分配var seeds = !{seedsSerialized};
  • @BretCopeland 我正在尝试将 JSON 传递给 Jade 模板,我相信它已经完成了,因为这个变量 seeds 给出了我上面提到的输出。我基本上有一组括号,我试图将团队名称放入其中。在单独的 JS 文件中,我似乎无法访问 seeds,当我尝试输出 seeds 时,它是空白的,什么都没有。所以是的,问题是我无法从我的 JS 文件中访问它。我不确定seedsSerialized,一位朋友正在帮助处理那行代码,这就是它的离开方式,对此感到抱歉。
  • 在包含使用该变量的任何其他脚本之前,您是否确保已声明 seeds? (换句话说,您在页面上包含脚本的顺序很重要。)
  • JSON 中 _id 的值是否无效。难道它们不需要用引号括起来以使它们成为字符串吗?
  • @BretCopeland 正确,正在加载的唯一其他脚本中没有任何变量 seeds

标签: javascript json node.js pug


【解决方案1】:

这可能不是一个确切的答案,但评论太长了......

看看这个 jsfiddle:http://jsfiddle.net/KvXTA/

var seeds = [{ name: 'Team 1',
  _id: 5134d71192cf972226000003,
  __v: 0,
  key: 1362417425623 },{ name: 'Team 2',
  _id: 5139dc66b48da58d0e000001,
  __v: 0,
  key: 1362746470498 },{ name: 'Team 3',
  _id: 5139dda45f1598440f000001,
  __v: 0,
  key: 1362746788314 },{ name: 'Team 4',
  _id: 513b2c66cfd50dce11000001,
  __v: 0,
  key: 1362832486554 }];

console.log(seeds);

注意控制台的输出方式

Uncaught SyntaxError: Unexpected token ILLEGAL

这是因为 _id 字段。我很惊讶你说序列化版本有同样的问题,因为它应该用引号括住 ID。如果您根本不需要 ID,您可以在序列化版本中使用替换函数将其删除。

var seedsSerialized = JSON.stringify(teams, function (key, val) {
    return key === '_id' ? undefined : val;
);
res.render('tournamentDetails', { seedsSerialized: seedsSerialized });

然后使用该序列化版本在模板中初始化seeds

script
    var seeds = !{seedsSerialized};

我之前关于包含脚本顺序的评论并不是担心另一个文件正在创建种子变量,而是您可能已经包含了一个在 seeds 实际声明之前使用 seeds 的文件。

例如:

<script src='logSeeds.js'></script>
<script>
    var seeds = [ ... ];
</script>

logSeeds.js 在哪里:

console.log(seeds);

显然会输出undefined,因为尚未声明seeds。这只是一个想法,不一定是你的情况。

【讨论】:

  • var seeds = JSON.stringify(#{tournamentData.teams}, function (key, val) { return key === '_id' ? undefined : val; }); 我已经用这个替换了 Jade 模板上的代码,以便尝试继续前进,但如果我尝试将 alert(seeds) 放入其中,仍然无法显示任何内容JS文件什么也没有出现。不太明白发生了什么,我只是希望能够使用这个 JS 文件在 Jade 模板上打印团队的名称,我尝试修复这个问题的时间似乎是不可能的。
  • JSON.stringify 代码不适合在模板中使用。您需要在 Node.js 代码中执行 stringify,然后将 stringified 版本发送到模板。在模板内部,stringify 代码将像原始代码一样失败。
  • 抱歉,将此添加到 node.js 代码中,以便 Jade 模板只有 var seeds = #{seedsSerialized} 与您使用的代码。在alert(seeds[0].name) 甚至seeds 的JS 代码中放一个警报,什么都不会出现。我错过了什么吗?
  • 做了一些测试,出于某种原因,如果我把 Jade 模板本身放在 #{seeds[i]} 上。不管i 是什么,它实际上给了我种子JSON 的字母,所以seeds[5] 给了我name 的a,奇怪吗?
  • 好的,然后试试var seeds = JSON.parse(!{seedsSerialized});,虽然我不认为输出会用引号括起来。你能重新发布模板的新输出吗?
猜你喜欢
  • 2016-09-19
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
  • 2016-03-24
  • 1970-01-01
  • 2015-04-19
  • 2013-11-04
  • 1970-01-01
相关资源
最近更新 更多