我通过这个获得通过Require.js装载模板文件:Handlebars.js错过JSON数据
主app.js
define([
'backboneLoader',
'handlebars',
'text!templates/main.html',
'text!appdata.json'
],
function(
Backbone,
Handlebars,
MainTemplate,
AppData
) {
"use strict";
return Backbone.View.extend({
initialize : function() {
this.render();
},
render : function() {
var template = Handlebars.compile(MainTemplate);
var output = template(AppData);
this.$el.append(output);
console.log("appData:\n" + AppData);
console.log("MainTemplate:\n" + MainTemplate);
console.log("Output:\n" + output);
//smth extra
return this;
}
});
}
);
MainTemplate(main.html中)
<ul>
<li><b>Version:</b> {{version}}</li>
<li><b>Author:</b> {{author}}</li>
</ul>
应用程序数据(appdata.json)
{version: "0.0.1", author: "John Doe"}
输出:
<ul>
<li><b>Version:</b></li>
<li><b>Author:</b></li>
</ul>
虽然预期输出:
<ul>
<li><b>Version:</b> 0.0.1</li>
<li><b>Author:</b> John Doe</li>
</ul>
任何想法,我究竟做错了什么?谢谢!
UPD: 问题解决了。下面是更新主app.js:
define([
'backboneLoader',
'handlebars',
'text!templates/main.html!strip',
'text!appdata.json'
],
function(
Backbone,
Handlebars,
mainTemplate,
appData
) {
"use strict";
return Backbone.View.extend({
initialize : function() {
this.render();
},
render : function() {
var template = Handlebars.compile(mainTemplate);
var output = template(eval("(" + appData + ")")); //Object is expected by template(), not JSON.
this.$el.append(output);
console.log("appData:\n" + appData);
console.log("template:\n" + mainTemplate);
console.log("Output:\n" + output);
//smth extra
return this;
}
});
}
);
问题已解决。我刚刚取代: var output = template(AppData); with: var output = template(eval(“(”+ appData +“)”)); – 2012-03-26 11:44:09
请不要使用'eval'!这是不好的做法,也是一个安全缺陷,因为如果任何JavaScript文本在文本中,它将被评估。最好使用'JSON.parse(appData)'。您可能需要包含'json2.js'来为旧浏览器(<= IE7)添加JSON支持:https://github.com/douglascrockford/JSON-js/ – frontendbeauty 2012-08-01 19:46:58