我在布局管理器中遇到问题,要让视图等待渲染,直到完成一堆AJAX调用并成功填充我传递给子视图的集合。
这是我的初始化函数:
initialize : function(){
var collection;
collection = new BobLawBlaw.Collection();
collection.fetch();
this.collection = collection;
}
我的提取有点复杂:
fetch : function(){
var that = this;
return $.when.apply(null, TL.reporting.getData.call(this, 125)).done(function(xhr1, xhr2){
var data1 = xhr1[0].data, data2 = xhr2[0].data, dates = data1.date,
// do a bunch of stuff with the data i get above to construct the models how i need
models = [
// bunch of objects using the data
];
that.add(models);
});
}
getData
函数从两个ajax调用中收集延迟并将它们返回到一个数组中,从而允许在两个调用完成时触发done
函数。这按预期工作,我可以获得我需要的所有数据。
但是,触发该提取时初始化函数中的流不会停止,因此在LayoutManager进入beforeRender之前,不会及时填充该集合。我怎样才能异步获取,但是让initialize函数等到ajax调用完成并填充集合?
答案 0 :(得分:2)
您可以随时listenTo
收集该集合上的活动。
initialize : function() {
this.collection = new BobLawBlaw.Collection();
this.listenTo(this.collection, 'sync', this.render);
this.collection.fetch();
}
因此,如果您收听sync
事件,则当集合与服务器同步时,将调用render
方法。
答案 1 :(得分:2)
如果您想以Backbone方式执行此操作,则应在done
回调中触发“重置”事件。然后,您在视图中收听此事件以启动render
功能。用that.add( models )
替换that.reset( models )
将添加模型并为您触发事件。
然后在视图的初始化函数中:
// ...
this.listenTo( collection, 'reset', this.render, this );
完成提取后将调用this.render
函数。