通过 javascript 访问车把变量

Posted

技术标签:

【中文标题】通过 javascript 访问车把变量【英文标题】:Accessing handlebars variable via javascript 【发布时间】:2015-08-26 09:20:41 【问题描述】:

我正在为 express js 框架生成一个把手视图,我需要从一个单独的 javascript 文件中访问我传递给视图的变量。

例如:

var foo = user.name

有人有想法吗?帮手?

【问题讨论】:

【参考方案1】:

如果您想将<script> 包含在<script> 中,则需要将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";
// result
var foo = "john.doe";

您还可以利用 JSON 和 JavaScript 在语法上的相似性,输出 JavaScript 可以理解为表达式的 JSON,并且已经包含引号。

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

请注意最后一个示例中的三重 ... 以禁用 html 编码,因此您不会得到:

var foo = "john.doe"

【讨论】:

感谢您的帮助!我在任何地方都没有看到这种方法: var foo = "user.name";这对我帮助很大:) 我有<script>var foo = myJson</script>,其中 myJson 是一个相当大的对象,似乎车把无法解析它。只有当我尝试了我在回答中建议的解决方案时,我才能让它工作 这个也适用于我:var foo = "user.name";谢谢! 可以从 *.js 文件中获取值吗?或者我必须将值设置为元素属性data-my-value 并以这种方式获取? 这个解决方案不再起作用了吗?我在其他地方也见过它,但是每当我声明一个分配给 helper value 的变量时,我都会收到一个语法错误,第一个 作为意外标记。人们如何在客户端 javascript 中设置一个等于具有三方括号的值的变量?【参考方案2】:

Node 可以像这样将编码的 JSON 传递给把手视图:

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

handlebars-view 可以像这样解码和解析 json:

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

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


我尝试了此线程中的其他建议。但是他们将未编码的 JSON 注入到车把视图中,这总是给我解析错误。我不知道人们是如何让它工作的,因为 Handlebars 似乎会将变量解析为纯文本。

我尚未了解 Handlebars 解析器的工作原理 - 但在我看来,唯一安全的选择是使用编码的 JSON,就像我在示例中所建议的那样。

【讨论】:

render 函数的编码将我的数据破坏为无法使用的[object][object] 字符串。所以我改为通过视图助手对其进行编码。此外,使用三方括号 会导致我出现语法错误。双括号工作正常。总而言之,这个解决方案为我指明了正确的方向。 这对我有用,但仅当脚本标记直接位于 .hbs 文件中时才有效。如果我从另一个文件夹链接脚本文件,它不会接收到编码文本。您知道是否可以访问外部脚本文件中的编码文本?在 中访问它【参考方案3】:

我也不知道如何在单独的 js 文件中执行此操作。这些答案使我朝着正确的方向前进,所以谢谢!在通过渲染将数据传递到页面之前,我最终在服务器端对数据进行了 JSON 字符串化。但是,我仍然无法让代码在单独的 js 文件中工作——这很好。我的用例是 Materialise 输入表单自动完成。

node.js

// 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
)

客户端js

// code placed within script tags of the handlebars file, not a separate js file

const customers = customers

【讨论】:

【参考方案4】:
var pageData = "pageData";
pageData = pageData.replace(/&quot;/g, `"`);
pageData = JSON.parse(pageData)

其中 pageData 是一个对象(可能包含其他对象)

【讨论】:

以上是关于通过 javascript 访问车把变量的主要内容,如果未能解决你的问题,请参考以下文章

车把,访问父每个循环变量

通过车把部分传递变量

如何从车把模板访问主干模型的计算字段?

如何从车把模板访问主干模型的计算字段?

从木偶视图重新加载部分车把将无法访问为父视图中的部分模板元素定义的 ui 对象

将车把数据发送到客户端javascript