通过ejs将参数从node.js传递给knockout.js

我有一个node.js消耗mongodb数据,并使用knockout.js输出列表

当我调用视图我传递一个JSON结构使用

res.render('list', { items:json }); 

在list.ejs模板页面中,我定义了一个隐藏的元素:

 <input type="hidden" id="hidden" value="<%= items %>"> 

并在.js文件我读它的价值:

 var json=$("#hidden").val(); var tkts=jQuery.parseJSON(json); var vm=new AppViewModel(tkts); 

嗯…它运行,但我认为(希望)必须有一个更好的办法做到这一点…有没有办法避免隐藏的HTMLvariables,例如?

目前我可以想到三种方法来做到这一点。

1.)将数据分配给JavaScript代码中的variables:

 <script type="text/javascript">solution1 = {"name": "solution1"}</script> solution1 

2.)添加一个数据属性到你喜欢的元素:

 <div id="solution2" data-value='{"name": "solution2"}'></div> JSON.parse(document.getElementById('solution2').dataset.value) 

3.)使用script标签并select不同于text / javascript或application / javascript的内容types

 <script id="solution3" type="script" type="text/json">{"name": "solution3"}</script> JSON.parse(document.getElementById('solution3').innerHTML) 

现场演示

http://jsfiddle.net/bikeshedder/sbjud/

个人笔记

这可能听起来很无聊,但第一个select可能是最好的select。 它速度很快,需要尽可能less的代码,只是工作。 如果您可以立即将它作为JavaScript数据,我不会看到为什么您希望首先将数据放在string中。

你可以添加一个内联脚本,如果你正在提供一个完整的页面…当然这会污染全局命名空间。

 <script> var tkts = <%= items %>; </script> 

如果您使用AJAX来获取此页面…然后将其分解成两个AJAX请求…其中一个获取模板,另一个可以获取项目列表(作为JSON请求)。 他们可以平行运行,所以它可能更快。