Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过javascript访问Handlebar变量_Javascript_Node.js_Express_Handlebars.js - Fatal编程技术网

通过javascript访问Handlebar变量

通过javascript访问Handlebar变量,javascript,node.js,express,handlebars.js,Javascript,Node.js,Express,Handlebars.js,我正在为expressjs框架生成一个handlebar视图,我需要从一个单独的JavaScript文件中访问传递给该视图的变量 例如: var foo = {{user.name}} 有人有主意吗?Helper?如果要将包含在中,则需要将user.name的值作为有效的JavaScript表达式输出,并将其作为代码重新计算 当前,例如,如果user.name是“john.doe”,则生成的脚本将是: var foo = john.doe; // `john` is treated as an

我正在为expressjs框架生成一个handlebar视图,我需要从一个单独的JavaScript文件中访问传递给该视图的变量

例如:

var foo = {{user.name}}

有人有主意吗?Helper?

如果要将
包含在
中,则需要将
user.name
的值作为有效的JavaScript表达式输出,并将其作为代码重新计算

当前,例如,如果
user.name
“john.doe”
,则生成的脚本将是:

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

user.name
至少需要用引号括起来,以便理解为字符串值/文字

var foo = "{{user.name}}";
您还可以利用JSON和JavaScript在语法上的相似性,输出JavaScript可以理解为表达式的JSON,并且已经包含引号

Handlebars.registerHelper('json', function (content) {
    return JSON.stringify(content);
});

请注意上一个示例中的三元组
{{{{…}}}
禁用HTML编码,因此不会导致:

var foo = "john.doe"

节点可以将编码的JSON传递到Handlebar视图,如下所示:

result.render('index', { 
  encodedJson : encodeURIComponent(JSON.stringify(jsonData))
});
handlebars视图可以解码和解析json,如下所示:

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

var decodedJson=decodeURIComponent(“{{{{encodedJson}}}”);
var jsonObj=JSON.parse(decodedJson);

由于传递给Handlebar视图的任何内容基本上都将直接注入HTML,因此您应该始终传递编码的json并让视图对其进行解码


我在这篇文章中尝试了其他建议。但是他们将未编码的JSON注入Handlebar视图,这总是给我带来解析错误。我不知道人们是如何做到这一点的,因为手柄似乎可以将变量解析为纯文本


我还没有读过Handlebar解析器是如何工作的——但在我看来,唯一安全的选择是使用编码的JSON,就像我在示例中建议的那样。

我也不知道如何在单独的js文件中实现这一点。这些答案引导我走向正确的方向,谢谢!在通过render将数据传递到页面之前,我在服务器端对数据进行了JSON字符串化。但是,我仍然无法让代码在单独的js文件中工作——这很好。我的用例是实现输入表单自动完成

node.js 客户端js
其中pageData是一个对象(可能包含其他对象)

感谢您的帮助!我没有看到这个方法:var foo=“{{user.name}}”;这对我帮助很大:)我有
var foo={{{{{{myJson}}}
其中myJson是一个相当大的对象,似乎handlebar无法解析它。只有当我尝试了我在回答中建议的解决方案时,我才能让它工作。这个解决方案也适用于我:var foo=“{{user.name}}”;thnx!是否可以从*.js文件中获取值?或者我必须将该值设置为元素属性
数据我的值
,并以这种方式获取它?此解决方案不再有效吗?我在别处也看到过,但是每当我声明一个分配给{{{helper value}}}的变量时,第一个变量就会出现语法错误{作为意外标记。人们如何将变量设置为客户端javascript中具有三个方括号的值?从
render
函数进行编码会将我的数据损坏为无法使用的
[object][object]
字符串。因此,我改为通过视图辅助程序进行编码。此外,使用三个方括号
{{{
会给我造成语法错误。双括号很好。总而言之,这个解决方案设法将我指向正确的方向。这对我来说很有效,但只有当脚本标记直接位于.hbs文件中时才有效。如果我从另一个文件夹链接脚本文件,它不会拾取编码文本。你知道是否可以访问en外来脚本文件中的编码文本?在
var foo = &quot;john.doe&quot;
result.render('index', { 
  encodedJson : encodeURIComponent(JSON.stringify(jsonData))
});
<script>
  var decodedJson = decodeURIComponent("{{{encodedJson}}}");
  var jsonObj = JSON.parse(decodedJson);
</script>
// code is inside of a router.get block, therefore access to the response(res)

let customerData = {}
// add customer data with a loop, or whatever

const customers = JSON.stringify(customerData)

res.render('path/to/page', {
    customers
})
// code placed within script tags of the handlebars file, not a separate js file

const customers = {{{customers}}}
var pageData = "{{pageData}}";
pageData = pageData.replace(/&quot;/g, `"`);
pageData = JSON.parse(pageData)