Backbone多次集合提取

时间:2013-10-21 19:09:40

标签: jquery backbone.js

是否有更性感的方式做到以下几点:

scheduleSubjects.fetch({
    success: function(){
        subjectList.fetch({
            success: function(){
                assignments.fetch({
                    success: function(){
                        _this.render();
                    }
                });
            }
        });
    }
});

我希望在开始操作之前检索所有数据。

感谢。

4 个答案:

答案 0 :(得分:8)

使用JQuery's deferred objects,您可以使用$.when在多个异步调用完成后触发回调:

$.when(scheduleSubjects.fetch(), subjectList.fetch(), assignments.fetch()).then(_this.render);

请注意,这是有效的,因为JQuery.ajax,因此Backbone.fetch也会返回延迟对象。


.then的替代方法是.done,它会传递原始回调的参数(您在OP中不需要,但在某些情况下可能会这样):

$.when(scheduleSubjects.fetch(), subjectList.fetch(), assignments.fetch())
    .done(function(scheduleSubjects, subjectList, assignments) {
        _this.render();
    })
);

答案 1 :(得分:7)

var collections = [scheduleSubjects, subjectList, assignments];
var complete = _.invoke(collections, 'fetch');

$.when(null, complete).then(function(){
    _this.render();
});

使用Promises和Underscore的_.invoke()

答案 2 :(得分:2)

你可以使用promises:

scheduleSubjects.done(function () {
  subjectList.fetch();
});
subjectList.done(function () {
  assignments.fetch();
});
assignments.done(function () {
  _this.render();
});
scheduleSubjects.fetch();

或事件监听器:

subjectList.listenToOnce(scheduleSubjects, 'sync', subjectList.fetch);
assignments.listenToOnce(subjectList, 'sync', assignments.fetch);
this.listenToOnce(assignments, 'sync', this.render);
scheduleSubjects.fetch();

您不必在视图中定义这些侦听器。他们可以生活在应用程序级别。 视图唯一关心的是在获取assignments后呈现

答案 3 :(得分:0)

我能想到的另一种方法是使用主干bind()trigger()

通过事件,您可以实现此功能..不确定是否有更好的方法。加载完第一个集合后,您可以触发第二个集合的加载。理论上,根据您的示例,两个集合不应该耦合。基于事件的加载将与subjectListscheduleSubjects分离。