在我的应用程序中,我需要提供一个API(类似Google Maps javascript API),通过它我可以发送一些自定义的javascript(带有一些会话和请求相关信息)作为响应。然后使用javascript在UI上绘制一些图形。我正在使用Express with Jade作为我的模板引擎。我目前使用的代码是:
app.use('/graph',function(req, res){
//send out graph data
var var_name = req.session.var_name //fetch something from session
var graphData = fetchGraphData(req.query.graph); //function that fetches graph data
res.contentType("text/javascript");
res.render(__dirname + '/views/graph.jade', {
title: "Title", queryStr: JSON.stringify({var_name: var_name, graphData: graphData })
});
});
和玉文件:
| some_var_name = {
| initGraph : function(divId){
| //some code here
| var graphData = !{graphData}
| // do something
作为一种解决方法,我使用|
启动了jade文件的每一行,以便jade将文本解析为纯文本,并且不添加任何html标记!它工作正常,但是有更清洁的方法吗?解决方案可能会也可能不会使用Jade!
答案 0 :(得分:6)
你应该研究underscore templates。我认为,为了生成任意文本输出,它会更清洁。 Jade专门用于呈现HTML。
您还可以尝试Mustache或Handlebars。
根据您的评论,我发现您希望继续使用res.render
来呈现模板。 consolodate.js为Express增加了对所有主要模板引擎的支持。包括@TheHippo提到的Underscore模板,Handlebars,Moustache和Dust。
答案 1 :(得分:1)
您可以尝试定义需要在模板外部的单独模块中发送到浏览器的JavaScript函数,从“关注点分离”的角度来看,这可能是更正确的方法。此外,如果功能在单独的模块中定义,则可以在服务器和浏览器中使用它们。
然后你可以在调用模板的函数中或者在模板内部使用toString()方法将函数转换为字符串,如果它支持纯JavaScript,那就是下划线,EJS和doT模板的情况(我试过了)下划线和EJS最终都使用了doT,这不仅是最快的,而且非常通用 - 请查看它:
JS代码:
// if you send the same functions you may want to convert them to strings in advance
var data = {
funcStr: func.toString();
};
res.render(view, data);
模板(doT):
<script type="text/javascript">
func = {{= it.funcStr }};
// now you can call it here if you want but I would use
// separate JavaScript files
func();
</script>
我用它将预先编译的模板与第一页加载的页面一起发送到浏览器,但我认为它也可以在你的情况下使用。
作为一个附带问题,为什么不能将所有这些函数捆绑在一个单独的JavaScript模块中并将它们作为普通脚本文件加载?