3

我在布局管理器中遇到问题,让视图等待渲染,直到一堆 AJAX 调用完成并成功填充了我传递给子视图的集合。

这是我的初始化函数:

initialize : function(){
            var collection;

            collection = new BobLawBlaw.Collection();
            collection.fetch();

            this.collection = collection;
        }

我的 fetch 有点复杂:

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在两个调用都完成时触发该函数。这按预期工作,我可以获得我需要的所有数据。

但是,在触发该 fetch 时,初始化函数中的流程不会停止,因此在 LayoutManager 进入 beforeRender 之前不会及时填充集合。如何异步获取,但让初始化函数等到两个 ajax 调用完成并填充集合?

4

2 回答 2

2

您可以随时listenTo对事件进行收藏。

initialize : function() {

   this.collection = new BobLawBlaw.Collection();
   this.listenTo(this.collection, 'sync', this.render);
   this.collection.fetch();
}

因此,如果您 listenTosync事件,该render方法将在集合与服务器同步时被调用。

于 2013-06-13T22:46:09.073 回答
2

如果您想以 Backbone 方式执行此操作,则应在done回调中触发“重置”事件。然后,您在视图中收听此事件以启动该render功能。替换为that.add( models )that.reset( models )添加模型并为您触发事件。

然后在视图的初始化函数中:

// ...
this.listenTo( collection, 'reset', this.render, this );

this.render获取完成后将调用该函数。

于 2013-06-13T22:51:02.333 回答