通过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请求)。 他们可以平行运行,所以它可能更快。