如何使用骨干布局管理器在骨干网中异步获取数据?

时间:2013-06-13 22:14:06

标签: javascript jquery backbone.js backbone-layout-manager

我在布局管理器中遇到问题,要让视图等待渲染,直到完成一堆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调用完成并填充集合?

2 个答案:

答案 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函数。