我不知道在Backbone View中的Handlebars.registerHelper函数中定义上下文(JSON对象)的位置。
当我通过$ .getJSON访问它时,我能够在控制台中呈现我的辅助函数数据,但我无法将辅助函数中的数据导入到我的模板中:
var SurveyView = Backbone.View.extend({
template: Handlebars.compile(
'<ul>' +
'{{#each models}}<h3>{{attributes.name}}</h3><h4>{{attributes.question}}</h4>'+
'<li>{{#answerList info}} {{{answers}}}{{/answerList}}</li>{{/each}}' +
'</ul>' +
'<button type="button" class="btn btn-danger">Next</button>' +
),
helperOne: function() {
Handlebars.registerHelper('answerList', function(context, options) {
var output = "";
$.getJSON('questions', function(info) {
for (var i = 0; i<info.length; i++ ){
var infos = info[i];
for (key in infos.answers) {
if(infos.answers.hasOwnProperty(key)) {
output += '<li>' +
'">' + info[i].answers[key] +
'</li>';
console.log(output);
}
}
}
});
return output;
}); //end register
},
initialize: function() {
this.listenTo(this.collection, "reset", this.render);
},
render: function () {
this.helperOne();
this.$el.html(this.template(this.collection));
return this;
}
});
答案 0 :(得分:1)
尝试在Handlebars助手中进行AJAX调用并不是一件非常有效的事情。帮助程序只知道文本:帮助程序返回一段文本,它可能会成为一组DOM节点,但帮助程序无法知道DOM节点是什么,所以它不能更新页面上的任何内容。 AJAX调用从服务器返回。
你需要改变你的逻辑:
在您的情况下,您可以完全摆脱helperOne
。然后,大概你有一个Answer
Backbone模型和一个包含AnswerList
s的Answer
集合。您可以在某个地方fetch
上AnswerList
,当它返回时,您可以更新您的视图。