我正在使用带有Handlebars的BackboneJS作为我的模板。几乎在任何时候都能正常工作。 但是在一个问题上,它没有我想要的那么好。
在加载页面时,我需要从数据库中获取一些信息以加载到页面中(使用把手)。我正在使用jQuery的$ .ajax()来获取JSON对象中的数据。
首先,我在Backbone View的initialize方法中运行$ .ajax()。 但是,有时(并非总是)数据没有出现在我的模板中。
作为测试,我现在将$ .ajax()放入Backbone View的render方法中。 我没有再看到这个问题,但不幸的是,这并不意味着它不存在,因为它不会每次都出现。
编辑:我刚刚再次遇到同样的问题,所以不幸的是将它放在渲染中并没有帮助。
那么我应该如何解决这个问题?
只是为了它的乐趣......这是代码:
var OF = OF || {};
OF.ReferrerView = Backbone.View.extend({
el: '#content',
initialize: function() {
if (!OF.address || !OF.address.isValid()) {
OF.router.navigate('step/1', {trigger: true});
}
OF.customerReferrer = OF.customerReferrer || new OF.CustomerReferrer();
}
render: function() {
//save this in that ;)
var that = this;
var sendObj = {
"selectAdult": OF.address.adultTreatment
};
//get referrer info
$.ajax({
url: "php/fakeAPI/referrer.php",
type: "POST",
dataType: "json",
data: sendObj,
success: function(data) {
OF.customerReferrer.referrerTypes = data.referrerTypes;
}
});
OF.template.get('step4-step4', function(data) {
//set the source en precompile the template
var htmlSource = $(data).html();
var template = Handlebars.compile(htmlSource);
//fill template with object or ''
var compiled = template(OF.customerReferrer);
//now place the completely compiled html into the page
that.$el.html(compiled);
});
}
});
答案 0 :(得分:1)
不要在视图中发出ajax请求。最好不要使用它们,而是使用正确配置的Model或Collection子类,但如果必须进行手动ajax调用,至少在模型中进行。然后让您的视图绑定到模型上的同步/更改事件并进行适当的渲染。