是否有更性感的方式做到以下几点:
scheduleSubjects.fetch({
success: function(){
subjectList.fetch({
success: function(){
assignments.fetch({
success: function(){
_this.render();
}
});
}
});
}
});
我希望在开始操作之前检索所有数据。
感谢。
答案 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()
。
通过事件,您可以实现此功能..不确定是否有更好的方法。加载完第一个集合后,您可以触发第二个集合的加载。理论上,根据您的示例,两个集合不应该耦合。基于事件的加载将与subjectList
和scheduleSubjects
分离。