2015-06-10 50 views
4

我为express js框架生成handlebars视图,并且我需要访问从单独的JavaScript文件内传递给视图的变量。通过javascript访问handlebar变量

例如:

var foo = {{user.name}} 

有人有一个想法?帮手?

非常感谢!

PokeRwOw

回答

6

user.name需求的价值是作为一个有效的JavaScript表达式输出,如果你想将其包含在<script>,将被重新评估它的代码内。

目前,如果user.name"john.doe"例如,生成的脚本将是:

var foo = john.doe; // `john` is treated as an object with a `doe` property 

user.name至少需要加引号,所以它理解为一个字符串值/文本。

var foo = "{{user.name}}"; 
// result 
var foo = "john.doe"; 

您也可以利用JSON和JavaScript的语法相似之处,输出JSON是JavaScript可以理解为一种表达,并已经包括引号。

Handlebars.registerHelper('json', function (content) { 
    return JSON.stringify(content); 
}); 
var foo = {{{json user.name}}}; 
// result 
var foo = "john.doe"; 

注意在最后一个例子三重{{{...}}}禁用HTML编码,这样你就不会结了:

var foo = &quot;john.doe&quot; 
+0

谢谢你的帮助!我没有看到这个方法:var foo =“{{user.name}}”;它帮了我很多:) – PokeRwOw

+0

我有''其中myJson是一个非常大的对象,看起来像把手无法解析它。当我在我的答案中尝试了我建议的解决方案时,我只能得到它的工作 – Drkawashima

7

节点可以将编码的JSON传递给车把 - 视图是这样的:

result.render('index', { 
    encodedJson : encodeURIComponent(JSON.stringify(jsonData)) 
}); 

的车把视图可以解码和解析JSON像这样:

<script> 
    var decodedJson = decodeURIComponent("{{{encodedJson}}}"); 
    var jsonObj = JSON.parse(decodedJson); 
</script> 

因为任何传递给车把观点基本被直接注入到HTML ,你应该总是传递编码的json并让视图对它进行解码。

我尝试了使用未编码JSON的其他建议,但他们给了我一个解析错误。看起来像把手将变量解析为纯文本。所以对我来说,它似乎是编码您的JSON最安全的解决方案。