如何从 underscore.js javascript 模板库引用名称中带有句点的 JSON 属性

Con*_*wer 1 backbone.js underscore.js

我正在使用下划线模板引擎(作为 Backbone.js 的一部分),并且遇到一个问题,即 JSON 对象的属性中有一个句点,即

{
"id": 1234,
"company.id": 4321
}
Run Code Online (Sandbox Code Playgroud)

当我尝试在下划线模板中访问此内容时,出现 JavaScript 错误:

Company ID: <@= company.id @>
Run Code Online (Sandbox Code Playgroud)

我想知道是否有可能以及如何访问带有句点的属性。我无法更改 JSON 的生成。

考珀

mu *_*ort 5

解决这个问题的一个简单方法是将另一个对象包裹在它周围,以便您可以使用[]来访问\'company.id\'. 例如,您的模板可能如下所示:

\n\n
<script id="tmpl" type="text/html">\n    id: <%= o.id %><br>\n    company: <%= o[\'company.id\'] %>\n</script>\xe2\x80\x8b\n
Run Code Online (Sandbox Code Playgroud)\n\n

你的 JavaScript 是这样的:

\n\n
var html = _.template($(\'#tmpl\').html(), {\n    o: {\n        "id": 1234,\n        "company.id": 4321\n    }\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

演示: http: //jsfiddle.net/ambigously/wtLkP/1/ \n\xe2\x80\x8b\nUnderscore 模板编译器用于with为模板中的简单内容提供上下文<%= x %>,所以我不认为你\将会比上面的技巧做得更好o.。Underscore 从您的模板构建一个函数,您可以通过查看函数的属性来查看函数的源代码source

\n\n
var t = _.template(template_source);\nconsole.log(t.source);\n
Run Code Online (Sandbox Code Playgroud)\n\n

这会给你这样的东西:

\n\n
function(obj){\nvar __p=\'\';var print=function(){__p+=Array.prototype.join.call(arguments, \'\')};\nwith(obj||{}){\n__p+=\'\\n    id: \'+\n( o.id )+\n\'<br>company: \'+\n( o[\'company.id\'] )+\n\' and stuff\\n\';\n}\nreturn __p;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

你会明白为什么<%= [x] %>不起作用:with只调整当前范围,它不能生成[x]有效的 JavaScript。

\n